Sting 内存分配问题

img

img


这两个有什么区别吗,这里的c到底指向的是常量池中的“abcde”还是指向一个对象

因为C相当于一个新的对象
第一个里边 c.intern() 引用找不到常量池 所以同样引用的C新生成的对象 所以是true
第二个里边 c.intern() 引用的是d中已经存在的常量池 但是c还是一个新对象 所以为false

图1无对应字符串的常量池,分配至内存;图2反之,以常量形式存储

【以下回答由 GPT 生成】

问题答案:

String c = a + b这行代码中,c会指向一个新创建的对象。具体来说,当使用+运算符连接两个字符串时,Java会创建一个新的String对象,该对象的值为ab的连接结果。

而在String c = a.concat(b)这行代码中,c也会指向一个新创建的对象。concat方法是在String类中定义的方法,用于将两个字符串连接起来,它会创建一个新的String对象,该对象的值为ab的连接结果。

两段代码中的c对象都不会指向常量池中的字符串"abcde"。只有当通过字面量直接赋值的方式创建一个字符串时,才会将该字符串存储在常量池中。

以下为具体代码示例:

public class String1 {
    public static void main(String[] args) {
        String a = "abc";
        String b = "def";

        String c1 = a + b;
        System.out.println("c1: " + c1); // 输出:c1: abcdef

        String c2 = a.concat(b);
        System.out.println("c2: " + c2); // 输出:c2: abcdef

        System.out.println("c1 == c2: " + (c1 == c2)); // 输出:c1 == c2: false
    }
}

运行结果显示c1c2的值都为"abcdef",但它们指向的是不同的对象。因此,c对象在这两种情况下都不指向常量池中的字符串。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^