0
String s = new String("abc") 

我知道这会在堆中创建一个新的字符串对象。但我对 Kathy Sierra 在 SCJP 书中的陈述感到困惑。

它指出上述语句将在堆中创建一个对象,同时如果字符串“abc”不存在于字符串池中,它也会将“abc”添加到字符串池中。

谁能告诉我在上述情况下是否还在字符串池中创建了对象“abc”。

4

3 回答 3

0

字符串 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

于 2015-08-27T04:29:39.870 回答
-1

是的,它确实。为了优化内存使用,它这样做了。如果您创建另一个具有相同值“abc”的变量,新变量仍将指向更早的变量,而不是创建一个新变量。

不知何故,它试图不创建两个相等的对象

于 2015-08-27T04:30:29.623 回答
-1

是的,它将被创建,因为您的代码中此行之前没有相同的字符串。现在考虑这个例子。

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。为了更好地了解堆栈中的内容以及堆中的内容,请访问此处

于 2015-08-27T04:31:57.330 回答