为什么String Pool对文字和变量的行为有所不同?

时间:2013-10-21 14:22:40

标签: java string

当我使用双引号将2 字符串(+}运算符连接起来并与具有相同值的其他字符串文字进行比较时,结果为 true ..但是当我连续2个字符串变量和比较给出假?为什么会这样?

据我所知,当我们用(+)运算符连接字符串时,JVM返回新的StringBuilder(string...).toString(),它在堆内存中创建一个新的String实例,在String池中创建一个引用。如果这是真的,它如何在一个场景中返回 true 而在其他场景中返回false?

第一种情况:

    String string1 = "wel";
    String string2 = "come";
    string1 = string1 + string2; //welcome

    String string3 = "welcome";
    System.out.println(string3 == string1); // this returns false but have same hashcode

第二种情况:

    String string4 = "wel" + "come";
    String string5 = "wel" + "come";
    System.out.println(string4 == string5); // this returns true

有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

请关注评论。

 string1 = string1 + string2; //StringBuilder(string...).toString() which creates a new instance in heap..

 String string3 = "welcome"; // It is not in heap. 

所以string3 == string1 false

  String string4 = "wel" + "come"; //Evaluated at compile time

  String string5 = "wel" + "come"; //Evaluated at compile time and reffering to previous literal

所以string4 == string5true

答案 1 :(得分:1)

  

据我所知,当我们用(+)运算符连接字符串时,JVM返回新的StringBuilder(string ...)。toString(),它在堆内存中创建一个新的String实例

正确,除非两个操作数都是文字,否则在编译时会创建一个字符串常量并汇总。

  

和字符串池中的一个引用。

假。 String池中唯一的东西是String常量和String.intern()返回值。

  

如果这是真的

不是。

  

如何在一个场景中返回true而在其他场景中返回false?

因为你的前提不正确。