class Code {
public static void main(String[] args) {  String a = "abc";   
String b="abc";
String c="ab"+"c";
String d="ab";
String e=d+"c";
System.out.println(a==b); //true
System.out.println(a==c); //true
System.out.println(a==e); //false
System.out.println(a+" "+b+" "+c+" "+d+" "+e); //abc abc abc ab abc
   
}
}   String c="ab"+"c";
String e=d+"c";
这两句有什么不同。内存中是怎么分配的?

解决方案 »

  1.   

    看你用的JDK版本了
    新版本的JDK 会把 String c="ab"+"c"; 优化成 String c="abc";
    理论上,String e=d+"c";是要先创建一个对象 String tempObj ="c", 然后再和对象b相加,得到一个新对象赋给 e。事实上这个也可以优化,因为string是不可变对象,所以在d为常量的情况下,e也初始化为一个常量,没有使用上的差别。具体可以看看编译的java byte
      

  2.   

    因为如果是字符串 ‘abc’,他其实在编译时就是一个字符串对象
    c在编译时也会优化会一个字符串对象
    但e是在java程序运行时才产生的‘abc’对象
    这个string对象是在堆里创建的!
    而上面的字符串对象是在常量池里。当然比较时就不会‘==’
      

  3.   

    我来回答你:
    楼主请看,String c="ab"+"c";
    是将常量池中的ab 和 C ,放到一个新的内存里面
    而 String d="ab";
    而d的地址指向常量池中匿名对象指向的ab . 差别不大 ,没必要追究。