字符串文本的行为令人困惑

2022-09-01 10:59:25

在下面的代码中,字符串文本的行为非常混乱。

我可以理解第 1 行、第 2 行和第 3 行是 ,但为什么是 4 行?truefalse

当我打印两者的哈希码时,它们是相同的。

class Hello
{
   public static void main(String[] args)
   {
      String hello = "Hello", lo = "lo";
      System.out.print((Other1.hello == hello) + " ");     //line 1
      System.out.print((Other1.hello == "Hello") + " ");   //line 2
      System.out.print((hello == ("Hel"+"lo")) + " ");       //line 3
      System.out.print((hello == ("Hel"+lo)) + " ");         //line 4
      System.out.println(hello == ("Hel"+lo).intern());      //line 5
      System.out.println(("Hel"+lo).hashCode());   //hashcode is 69609650 (machine depedent)
      System.out.println("Hello".hashCode());       //hashcode is same WHY ??.
   }
}

class Other1 { static String hello = "Hello"; }

我知道检查引用相等性并在池中检查文本。我知道这是正确的方法。我想理解这个概念。==equals()

我已经检查了这个问题,但它没有解释清楚。

我希望能有一个完整的解释。


答案 1

每个类型的编译时常量表达式都将放入 String 池中。String

从本质上讲,这意味着:如果编译器可以(轻松)“计算”的值而无需运行程序,那么它将被放入池中(规则比这稍微复杂一些,并且有一些角落情况,请参阅上面的链接以获取所有详细信息)。String

对于第 1-3 行中的所有字符串都是如此。

"Hel"+lo不是编译时常量表达式,因为它是一个非常量变量。lo

哈希代码是相同的,因为字符串的哈希代码仅取决于其内容。这是 equals() 和 的协定所要求的。hashCode()


答案 2

在运行时通过串联计算的字符串是新创建的,因此是不同的

这里有一个链接阅读: http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5