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

时间:2015-08-27 04:27:40

标签: java string-pool

String s = new String("abc") 

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

它声明上面的语句会在堆中创建一个对象,如果String" abc"字符串池中不存在,它也会添加" abc"到字符串池。

有人可以告诉我对象" abc"在上面的例子中,也在String池中创建。

3 个答案:

答案 0 :(得分:0)

  

String s = new String(“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对象创建新的String对象时,它会重用char []值。 由于新的String(someStringValue)创建了现有字符串的精确副本,并且字符串是不可变的,因此显然没有理由让这两个字符串同时存在。

即使您有两个String对象,它们仍可能指向相同的内容。

您可以参考: - https://dzone.com/articles/string-memory-internals

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-1)

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

String temp = "abc";            // line1
String s = new String("abc");   // line2

在这种情况下,不会重新创建"abc"s将指向在第1行创建的"abc"

  

sujith在评论中:但在这种情况下,我看不出String temp =" abc"和String temp = new String(" abc")。

在第1行中,将在堆中创建新的"abc"。然后将创建一个新的String对象并将其添加到stack中。在第2行中,将创建一个String对象,该对象将引用"abc"中第1行创建的heap。为了更好地理解堆栈的内容以及堆visit here的内容。