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对象也在堆内存中。

 

posted @ 2022-11-16 15:27  霍根施拉格  阅读(24)  评论(0)    收藏  举报