Java - 构造函数中的自动字符串实习

时间:2016-07-12 09:59:48

标签: java string string-interning

假设我有一个课程如下:

class Apple {

    String apple;

    Apple(String apple) {
        this.apple = apple;
    }
}

是什么使以下代码成立?

public boolean result() {
    Apple a = new Apple("apple");
    Apple b = new Apple("apple");

    return a.apple == b.apple;
}

Java是否自动在我的对象实例中设置实习字符串?

Java是否只有在使用new String("...")创建它们时才实习?

修改

感谢您的回答,这个问题的扩展就是说

Apple a = new Apple(new String("apple"));
Apple b = new Apple(new String("apple"));

使用相同的测试返回 false

这是因为我将一个String实例传递给构造函数而不是String文字。

2 个答案:

答案 0 :(得分:3)

  

Java是否自动在我的对象实例中设置实习字符串?

重点是:当您创建第一个Apple a时,JVM会提供包含String的{​​{1}}实例。 "apple"已添加到String

因此,当您创建第二个StringPool重用Apple b时,您在Stringa.apple 中拥有相同的对象引用:

示例:

b.apple

输出:

Apple a = new Apple("apple");
Apple b = new Apple(new String("apple"));

System.out.println(a.apple == b.apple);
  

Java没有实习字符串的时间是他们使用新字符串创建的唯一时间(" ...")?

如果将String对象与false 进行比较,则比较对象引用,而不是内容。

比较==使用StringString::equals()

的内容

示例

String::intern()

相关问题

答案 1 :(得分:1)

apple中的字段Apple引用String

在您的情况下,引用是指一个实习字符串,因为您已使用将被实习的字符串文字实例化Apple

由于ab是从同一个互连字符串创建的,因此a.apple引用与b.apple相同的字符串。

如果使用new String,Java确实无法实习字符串。