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";
这两句有什么不同。内存中是怎么分配的?
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";
这两句有什么不同。内存中是怎么分配的?
新版本的JDK 会把 String c="ab"+"c"; 优化成 String c="abc";
理论上,String e=d+"c";是要先创建一个对象 String tempObj ="c", 然后再和对象b相加,得到一个新对象赋给 e。事实上这个也可以优化,因为string是不可变对象,所以在d为常量的情况下,e也初始化为一个常量,没有使用上的差别。具体可以看看编译的java byte
c在编译时也会优化会一个字符串对象
但e是在java程序运行时才产生的‘abc’对象
这个string对象是在堆里创建的!
而上面的字符串对象是在常量池里。当然比较时就不会‘==’
楼主请看,String c="ab"+"c";
是将常量池中的ab 和 C ,放到一个新的内存里面
而 String d="ab";
而d的地址指向常量池中匿名对象指向的ab . 差别不大 ,没必要追究。