String(2)
public class StringDemo { private static final String MESSAGE = "taobao"; public static void main(String[] args) { String a = "tao" + "bao"; String b = "tao"; String c = "bao"; System.out.println(a == MESSAGE); System.out.println((b + c) == MESSAGE); } }
true false
解析:
java中new出来的对象放在堆内存,指向对象的引用放在栈内存。
MESSAGE成员变量及其指向的字符串常量肯定都是在栈内存里的,变量a运算完也是指向一个字符串”taobao“。String a = "tao" + "bao"; 和 String MESSAGE = "taobao"; 编译出来的字节码是一样。所以它两指向的是同一个字符串。运行 b+c 计算出来的 "taobao" 和栈内存里已经有的 "taobao" 不是同一个,因为String的相加是通过StringBuffer实现的,先构造一个StringBuffer里面存放 "tao",然后调用append()方法追加 "bao",最后将值为 "taobao" 的StringBuffer转化成String对象。StringBuffer对象在堆内存中,所以转化成的String对象也在堆内存中。

浙公网安备 33010602011771号