String s = new String("abc") 内存分配

String s = new String("abc") memory allocation

String s = new String("abc") 

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

它声明上述语句将在堆中创建一个对象,同时如果字符串 "abc" 不存在于字符串池中,它还会将 "abc" 添加到字符串池中.

谁能告诉我在上面的例子中对象 "abc" 是否也在字符串池中创建。

String s = new String("abc")

是的,上面一行将创建两个对象,一个在字符串池中,另一个在堆中。

那么,现在

1) 如果你创建一个像这样的字符串文字:-

String s1="abc"; //abc value will be taken from string pool which is previously added 

2) 如果创建一个字符串对象并调用 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 将指向在第 1 行创建的 "abc"

sujith in comment : But in that case i do not see any difference between String temp ="abc" and String temp = new String("abc").

在第 1 行中,将在堆中创建一个新的 "abc"。并且将创建一个新的 String 对象并将其添加到 stack 中。在第 2 行中,将创建一个新的字符串对象,它将引用在 heap 中第 1 行创建的 "abc"。为了更好地理解什么东西进入堆栈以及什么进入堆 visit here.