String a = "abc";
这会在字符串池中创建文字"abc"
。
String b = "abc";
没有创建新的文字。 b
指向现有的"abc"
。
String c = new String("abc");
现在,对象在堆中创建,c
指向堆。文字也在字符串池中创建。
但是,如果池已经有文字"abc"
会怎样?池中会出现重复的文字吗?
答案 0 :(得分:6)
但是,如果游泳池已经有文字" abc"会发生什么?池中会出现重复的文字吗?
没有
String c = new String("abc");
在语义上等同于
String tmp = "abc";
String c = new String(tmp);
通过这个,应该很清楚,因为文字用作字符串构造函数的参数,所以不会创建字符串池中的额外条目。
new String(...)
在堆上创建一个字符串是正确的,因此查看堆和字符串池时,会有多个对象代表"abc"
,但不会超过一个字符串池。
[...]那是我们使用字符串文字的时候。但是,如果我们给出
,是否可以重用字符串池中的文字String a = new String("abc");
?
是的,如果您给出" abc"将会重复使用字符串池文字。作为构造函数的参数。但是,生成的String对象不在池中,而是在堆上。
答案 1 :(得分:3)
但是,如果池已经有文字“abc”会发生什么?
它将被重复使用。
如果您在某个地方String x = "abc";
和其他地方String y = "abc";
,则x == y
始终为true
。这证明实际上文字被重复使用。
答案 2 :(得分:0)
String池中不会有重复的条目,它将被另一个引用重用。
String s1="foo";
字面意思将进入池中,s1将引用。
String s2="foo";
这次它会检查" foo" literal已经在StringPool中可用,因为它现在已存在,所以s2将引用相同的文字。
String s3=new String("foo");
"富" ,通过字符串arg构造函数String对象将被创建,即" foo"在堆中由于通过new运算符创建对象,然后s3将引用它。
String interning using inter() method
Java默认情况下不会将所有String对象放入String池中, 相反,它们为您提供了显式存储任意任意的灵活性 String池中的对象。您可以将任何对象放入String池中 调用java.lang.String类的intern()方法。虽然,当你 使用String的字面文字表示法创建,它会自动调用 intern()方法将该对象放入String池中,前提是它 不在游泳池中。
答案 3 :(得分:0)
在执行此代码的任何之前,字符串池中的字符串文字"abc"
已。它由编译器和类加载器放在那里。在执行此代码时不会发生这种情况。
答案 4 :(得分:0)
String c = new String("abc");
现在,对象在堆中创建,c指向堆。的的强> 文字也会在字符串池中创建。
不会将字面值创建到字符串池中。它只会保留在堆中。 看到这张照片。
http://www.journaldev.com/797/what-is-java-string-pool
但是,如果游泳池已经有文字" abc"会发生什么?将 池中有重复的文字?
池中不能有重复值。因为字符串是java中的不可变对象。请参阅roger_that的这篇文章中的第二个答案。