TL; DR :如果您确实需要做
new String("abc"),您将知道自己需要,并且会知道为什么。这种情况非常罕见, 几乎可以说您不需要。只需使用
"abc"。
长版:
当您拥有代码时
new String("abc"),以下情况会在不同时间发生:- 加载包含该代码的类时,如果内部存储
"abc"
池中尚未包含带有字符的字符串,则会将其创建并放在其中。 - 当
new String("abc")代码运行:- 对
"abc"
来自内部缓冲池的字符串的引用将传递到String
构造函数中。 - 通过将传递过来的字符复制到构造函数中,可以创建并初始化一个 新
String
对象String
。 - 新
String
对象将返回给您。
- 对
如果使用new创建的字符串“
abc”也将字符串放置在池中,那么为什么intern()说如果字符串池包含字符串则返回池中的字符串,否则将字符串对象添加到池中。
因为那是什么
intern。请注意,调用
intern字符串文字是禁止操作的;字符串文字都将被自动嵌入。例如:
String s1 = "abc"; // Get a reference to the string defined by the literalString s2 = s1.intern(); // No-opSystem.out.println(s1 == s2); // "true"System.out.println(s1 == "abc"); // "true", all literals are interned automatically
我也想知道我们是否使用new创建了一个String,那么实际上创建了多少个对象?
您至少创建一个
String对象(新的,非intern的对象),并可能创建两个对象(如果文字尚未在池中;但是同样,在加载类文件的文字时,这会更早发生):
String s1 = "abc"; // Get a reference to the string defined by the literalString s2 = new String(s1); // Create a new `String` object (guaranteed)System.out.println(s1 == s2); // "false"String s3 = s2.intern(); // Get the interned version of the string with these charactersSystem.out.println(s1 == s3); // "true"



