改变String后的字符串池

时间:2013-07-26 05:28:48

标签: java string

我有这段代码

String a="test";
String b="test";
if(a==b)
   System.out.println("a == b");
else
   System.out.println("Not True");

每位Java专家都知道if(a==b)会因String pooling facility而传递Each time your code creates a string literal, the JVM checks the string literal pool first. If the string already exists in the pool, a reference to the pooled instance is returned. If the string does not exist in the pool, a new String object is created and placed in the pool. JVM keeps at most one object of any String in this pool. String literals always refer to an object in the string pool 根据String pooling
a+="1"
这就是为什么在上面的代码中条件已经过去了。
现在出现问题。在上面的代码中,当我添加了两行b+="1"Test1时,现在是字符串a&的值。 b将是String a="test"; String b="test"; if(a==b) System.out.println("a == b"); else System.out.println("Not True"); a+="1"; //it would be test1 now b+="1"; //it would also be test1 now if(a==b) System.out.println("a == b"); else System.out.println("Not True");
新代码就像这样

if(a==b)

现在在更改字符串后,当我放置new String()检查时它没有通过。我知道这是由于字符串的不变性功能但我想知道

1)更改后,JVM是否存储了两个不同的对象? 2) JVM是否会调用intern()来更改任何字符串?
3)为什么即使我尝试在更改时调用a+="1".intern();,他们也没有引用单个内容?
Q3提示:
{{ 1}}
            b+="1".intern();

3 个答案:

答案 0 :(得分:1)

1)是的,这就是a == b失败的原因。这些新字符串不是字符串池的一部分,因为它们不是来自开头的文字。

2)正如@LuiggiMendoza所指出的,如果编译器有办法知道字符串的值,它将使用String构造函数,否则它将在内部使用StringBuilder(在结尾处它将使用String构造函数返回最终字符串的那一天

3)即使“1”是文字,a + "1".intern();本身的结果也不是文字,而是使用String构造函数创建的新String对象,因此它不会添加到字符串池中。 / p>

答案 1 :(得分:1)

因为字符串是不可变的。在更改字符串后,您的变量现在将引用不同的String

创建new String时,如果在编译时未知值,则JVM使用StringBuilder;否则,使用标准String构造函数。

添加"1".intern()时,.intern()适用于"1" a + "1");连接产生新的String个对象( NOT 文字),因此ab不会引用相同的对象。请记住,当通过Strings运算符创建new时,会强制分配新内存。

为了让ab实际引用相同的对象,您必须同时调用.intern()

_a = _a.intern(); //adds _a to the String pool
_b = _b.intern(); //makes _b point to the same object as _a, since _b.equals(_a)

答案 2 :(得分:1)

这种情况正在发生,因为当你执行“+ =”时,由于字符串不变性,它会在堆上创建一个新对象,而不是在String池中。如果你想在字符串池中使用它,那么再次在两个字符串上调用 intern() 方法。

String a="test";
    String b="test";
    if(a==b)
        System.out.println("a == b");
    else
        System.out.println("Not True");
        a+="1"; //it would be test1 now
        b+="1"; //it would also be test1 now

       a=a.intern();
       b=b.intern();

    if(a==b)
       System.out.println("a == b");
    else
      System.out.println("Not True");

现在它会在两种情况下产生'a == b'。有关字符串池的更多信息,请转到此link