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.
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.