String s = new String("abc")
我知道这会在Heap中创建一个新的String对象。 但我对Kathy Sierra在SCJP一书中的陈述感到困惑。
它声明上面的语句会在堆中创建一个对象,如果String" abc"字符串池中不存在,它也会添加" abc"到字符串池。
有人可以告诉我对象" abc"在上面的例子中,也在String池中创建。
答案 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对象,它们仍可能指向相同的内容。
答案 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的内容。