字符串 s = 新的字符串("abc") 内存分配


String s = new String("abc") 

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

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

谁能告诉我对象"abc"是否也在上述情况下的字符串池中创建。

String s = new String("abc")

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

那么现在

1)如果你创建一个字符串字面值:-

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

2)如果你创建一个String对象并调用intern方法,将不会创建新对象,而只是引用String pool中存在的"abc"。

String s2=new String("abc").intern();

注意:当我们基于现有的String对象创建新的String对象时,它会重用char[]值。由于new String(someStringValue)创建了现有字符串的精确副本,而字符串是不可变的,因此显然没有理由让两者同时存在。

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

你可以参考这个:- https://dzone.com/articles/string-memory-internals

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

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

在本例中,没有重新创建"abc"s将指向在第1行创建的"abc"

sujith in comment:但是在这种情况下,我没有看到String temp ="abc"和String temp = new String("abc")之间的任何区别。

第1行将在堆中创建一个新的"abc"。一个新的String对象将被创建并添加到stack中。在line2中,将创建一个新的String对象,该对象将引用heap中line1中创建的"abc"。为了更好地理解哪些东西要放到堆栈中,哪些东西要放到堆中,请访问这里

是的。为了优化内存使用,它会这样做。如果您创建另一个具有相同值"abc"的变量,新变量仍然指向先前的变量,而不是创建一个新变量。

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

相关内容

最新更新