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"的变量,新变量仍然指向先前的变量,而不是创建一个新变量。
它试图不创建两个相等的对象