基本每几天都有人问
但是说法一直都很多。。我也是越看越晕。。
所以问下,看看我的理解对不。
String a="a1":这种创建的string,"a1"被看做常量,在编译期创建对象.如果常量池里已经有"a1"则是引用已经存在的常量。
String a="a1"+"b1":编译期直接拼接成"a1b1",等价于String a="a1b1".
String a=new String():在运行期创建一个String对象,放在heap里.
String a=new String("a1"):在编译期如果常量池没有"a1"则创建"a1"这个对象,然后在运行期创建a对象,放到heap中值为"a1".
String a=a1+b1(或者"b1"):这个在运行期拼接,但是这种创建几个对象就有点说不清楚了
比如有
String a1="a1";
String a2="a2";
String a3="a3";
String b=a1+a2+a3;//这一步对象是怎么创建的?是直接一个对象等于a1+a2+a3?还是(a1+a2)一个对象,然后(a1+a2)+a3又一个对象?
希望对这个比较了解的能回答下好让我彻底把String的这些鬼问题搞清楚。。
但是说法一直都很多。。我也是越看越晕。。
所以问下,看看我的理解对不。
String a="a1":这种创建的string,"a1"被看做常量,在编译期创建对象.如果常量池里已经有"a1"则是引用已经存在的常量。
String a="a1"+"b1":编译期直接拼接成"a1b1",等价于String a="a1b1".
String a=new String():在运行期创建一个String对象,放在heap里.
String a=new String("a1"):在编译期如果常量池没有"a1"则创建"a1"这个对象,然后在运行期创建a对象,放到heap中值为"a1".
String a=a1+b1(或者"b1"):这个在运行期拼接,但是这种创建几个对象就有点说不清楚了
比如有
String a1="a1";
String a2="a2";
String a3="a3";
String b=a1+a2+a3;//这一步对象是怎么创建的?是直接一个对象等于a1+a2+a3?还是(a1+a2)一个对象,然后(a1+a2)+a3又一个对象?
希望对这个比较了解的能回答下好让我彻底把String的这些鬼问题搞清楚。。
准备看激烈的讨论
飞过~~,我也不懂和楼主一起学习~~
String a2="a2";
String a3="a3";
String b=a1+a2+a3;
==============================
这个创建一个对象。
不过这可以看作编译器对这种情况(全是常量)的优化。
严格按照JAVA的语法规则的话自然是(a1+a2)一个对象,然后(a1+a2)+a3又一个对象,
但是实际实现不是罢了
遇到相关的问题就可以准确的把以前的帖子找出来,佩服.
先谢谢啦。我去看了那帖子了。基本明白是怎么回事情了,和我原先猜测的差不多。但是从对象的个数上来说是怎么说呢?(我知道这问题有点无聊囧)
那么对于
String a1="a1";
String a2="a2";
String a3="a3";
String b=a1+a2+a3;
就是有 a1,a2,a3三个对象加上一个StringBuilder对象,和StringBuilder的toString产生的String对象了?囧绕进去了。