基本每几天都有人问
但是说法一直都很多。。我也是越看越晕。。
所以问下,看看我的理解对不。
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的这些鬼问题搞清楚。。

解决方案 »

  1.   

    在这个帖子的 45 楼,做了些测试,有兴趣的话可以去看看http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html看来 String 问题真是老得不能再老的问题
      

  2.   

    又见String~~
    准备看激烈的讨论
    飞过~~,我也不懂和楼主一起学习~~
      

  3.   

    String a1="a1"; 
    String a2="a2"; 
    String a3="a3"; 
    String b=a1+a2+a3;
    ==============================
    这个创建一个对象。
    不过这可以看作编译器对这种情况(全是常量)的优化。
    严格按照JAVA的语法规则的话自然是(a1+a2)一个对象,然后(a1+a2)+a3又一个对象,
    但是实际实现不是罢了 
      

  4.   

    不知道bao110908兄是如何管理自己的帖子的?
    遇到相关的问题就可以准确的把以前的帖子找出来,佩服.
      

  5.   

    有些帖子添加到网摘中,记上一个 Tag 就行了。
      

  6.   


    先谢谢啦。我去看了那帖子了。基本明白是怎么回事情了,和我原先猜测的差不多。但是从对象的个数上来说是怎么说呢?(我知道这问题有点无聊囧)
    那么对于
    String a1="a1"; 
    String a2="a2"; 
    String a3="a3"; 
    String b=a1+a2+a3;
    就是有 a1,a2,a3三个对象加上一个StringBuilder对象,和StringBuilder的toString产生的String对象了?囧绕进去了。