String s = new String("abc")
我知道这会在堆中创建一个新的字符串对象。但我对 Kathy Sierra 在 SCJP 书中的陈述感到困惑。
它指出上述语句将在堆中创建一个对象,同时如果字符串“abc”不存在于字符串池中,它也会将“abc”添加到字符串池中。
谁能告诉我在上述情况下是否还在字符串池中创建了对象“abc”。
String s = new String("abc")
我知道这会在堆中创建一个新的字符串对象。但我对 Kathy Sierra 在 SCJP 书中的陈述感到困惑。
它指出上述语句将在堆中创建一个对象,同时如果字符串“abc”不存在于字符串池中,它也会将“abc”添加到字符串池中。
谁能告诉我在上述情况下是否还在字符串池中创建了对象“abc”。
字符串 s = 新字符串(“abc”)
是的,上面一行将创建两个对象,一个在字符串池中,另一个在堆中。
所以,现在
1)如果您创建一个字符串文字,如:-
String s1="abc"; //abc value will be taken from string pool which is previously added
2) 如果你创建一个 String 对象并调用 intern 方法,则不会创建新对象,而只会引用字符串池中存在的“abc”。
String s2=new String("abc").intern();
注意:当我们基于现有对象创建新的 String 对象时,它会重用 char[] 值。由于 new String(someStringValue) 创建了现有字符串的精确副本并且字符串是不可变的,显然没有理由让两者同时存在。
即使您有两个 String 对象,它们仍可能指向相同的内容。
你可以参考这个:- https://dzone.com/articles/string-memory-internals
是的,它确实。为了优化内存使用,它这样做了。如果您创建另一个具有相同值“abc”的变量,新变量仍将指向更早的变量,而不是创建一个新变量。
不知何故,它试图不创建两个相等的对象
是的,它将被创建,因为您的代码中此行之前没有相同的字符串。现在考虑这个例子。
String temp = "abc"; // line1
String s = new String("abc"); // line2
在这种情况下"abc"
不会重新创建。s
将指向"abc"
在第 1 行创建的。
sujith在评论中:但在那种情况下,我看不出 String temp ="abc" 和 String temp = new String("abc") 之间有什么区别。
"abc"
在第 1 行中,将在堆中创建一个新的。并且将创建一个新的 String 对象并将其添加到stack
. 并且在 line2 中将创建一个新的 String 对象,该对象将引用"abc"
在 line1 中创建的对象heap
。为了更好地了解堆栈中的内容以及堆中的内容,请访问此处。