String s = "a" + "b" + "c" + "d" + "e";此句代码从头至尾共创建了几个对象,
在其他论坛看到的这个帖子,众说纷纭啊,我等菜鸟被彻底搞迷糊了,还是来CSDN鉴定清楚
下面是那个帖子里的2个说发:
1。就创建了一个
String s = "a" + "b" + "c" + "d" + "e";
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个
2.9个对象
分析如下:
String s只是一个对右边对象的引用不是对象,它引用的是右边表达式最后形成的对象,即"abcd" 再看右边 首先明确一点
String str=”aaa“;
上边的语句产生了一个对象
即右边是以双引号形式产生了一个String对象 此种形式的对象被存储在字符串池当中
题中右边的试子是以一下顺序来创建对象的
"a" 查找字符串池里没有与此字符串equal的字符串对象(注意是equal不是==)于是创建对象"a"
接着 "b" 同上 也在字符串池里创建对象"b" 接着 "a"+"b" 即 "ab" 同样 在字符串池里找不到equal的对象于是创建字符串池中对象"ab" 以此类推 产生9个对象 都存储在字符串池当中 分别是
"a"
"b"
"ab"
"c"
"abc"
"d"
"abcd"
"e"
"abcde"
个人比较倾向于第二个回答
"a" + "b" + "c" + "d" + "e" 这些在加载时都被放在一个字符串池里
不信的话去查java语言规范。
String s="ab"+"cd"+"ef"
像这种非基本类型是不是就是第二种说法这种情况了,生成了5个对象?
String s = "a" + "b" + "c" + "d" + "e";编译后再反编译的代码
String s = "abcde";
过程中创建了五个StringBuffer
调用了StringBuffer的append()方法;
楼主查一下String 和StringBuffer的区别
使用反java反编译工具,工具有很多,自己下吧,一般小于一MB
String s = "a" + "b" + "c" + "d" + "e";
}编译下上边的语句,然后再反编译下,如下:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: string.java
public class string
{ String s; public string()
{
s = "abcde";
}
}
这个问题比较屎!为什么?在Java里你只需要知道对象和对象应用就可以将一切java程序交代了!计较几个String对象的公司都是吃饱了 撑得!鉴定完毕!
这种语法知识个人感觉很无聊,只能考试用...
比如用String str = "hello";而不是
String str = new String("hello");
那估计是 Thinking in Java 比 Effective Java 的影响更为深远一些吧,呵呵
String str = "abcd";
if(str == s)
System.out.println(str);
}
原因:1. String类型一旦确定将不可更改。
2. String s = "a"+"b";这行代码执行过程:首先去Pool中找是否存在a,若不存在则创建,然后找是否存在b,若不存在则创建,最后调用cancat方法去连接字符串,并去查找是否存在ab,若不存在则创建。
3. 把ab的引用赋给s 。
上面有人说的反编译其实看到的并不是你“想当然”的结果,而是编译器处理后的最终结果,当然只有一个了。
而且,之所以StringBuffer的append方法比用“+”连接效率高就在于它是可变的,自始至终都是一个对象,而用“+”需要创建多个对象!
期待有人提出异议!!!!!!!!
比如String a = "a"+"b"+"c";编译器直接合并为a = "abc";
编译完得到class文件,里面执行的语句功能就是a = "abc"了。
java虚拟机只知道执行这么一句话,根本不知道"abc"到底是怎么来的。对于分不清编译和运行两个过程的,扯什么都白搭。
比如这样的例子
String a = "a";
String b = "b";
String c = a + b;
这时候a+b是两个变量连接,编译器无法进行直接的合并,它会考虑使用 StringBuilder连进行连接工作:
编译器处理为:
StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
然后String c=builder.toString();
java5之前用StringBuffer替换。String类的+操作会产生新对象,造成性能问题。多个String连接就看到优化的好处了,如
String a = "a";
String b = "b"
String c = "c";
String d = "d";
String e = "e";
String f = a + b + c + d + e;
最后一句将导致创建很多的String对象,"ab","abc","abcd","abcde"等。
而使用StringBuilder只需要创建一次,不断append。最后再转到String。
其实"a"+"b"它的值在编译时就确定了,而且是可以确定的。所以,会在string pool里新建一个对象“ab”,没有“a”和“b”。
http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html