String b="abcd"
String a= "a"
String c="bcd"
String d=a+c
system.out.println(d==b)// false
为什么是 false 根据java字符串常量只能有一份的原则,应该是true才对。
这里的内存图是什么样的
String b="abcd"
String a= "a"
String c="bcd"
String d=a+c
system.out.println(d==b)// false
为什么是 false 根据java字符串常量只能有一份的原则,应该是true才对。
这里的内存图是什么样的
JAVA 的字符串常量只能有一份的原则???
什么时候这种虚拟机优化,都能被当做原则了,我的天,谁给你保证的???
String d = a + c;
这个赋值当然是在这句执行的时候才会计算啊,计算出来的是一个新的变量,而不是字符串常量池里的那个。
说起来,这里也有一个优化的问题,字符串拼接会被优化为类似于 StringBuilder 操作。
你要非要说,为啥常量计算不直接编译的时候就能计算了,就完事了呗……
这个是程序正确性的问题了,已经不是优化的问题了。
首先要明确的是 引用数据类型 == 比较的是地址值,a+c 是StringBuffer 在起作用的
d==b 为false是因为其实是创建了一个StringBuffer对象,然后用StringBuffer对象执行append方法来创建出字符串对象“abcd”,调用toString,然后再转换成为String。但是这个转换后的String对象,是创建对象的,给放在堆里面,指向的内存地址的引用,而c是字符串常量的,所以当然不相等了啊,重点是在string相加的得到string字符串的。
String在比较值的时候需要用equals方法,b.equals(d)返回的是true,b的对象是"abcd"这个字符串的引用地址,而d是"a"和"bcd"拼接后的一个新对象,两个的引用地址不相同,所以==返回的是false,内存图得大神弄下,我也是菜鸡水平程序员。。。