Java:字符串不变性和运算符==

时间:2013-08-23 21:50:05

标签: java string immutability

我有这个我无法理解的代码。在开始时,您可以看到两个相同的字符串,当我使用运算符==进行比较时,它表示它是真的,与equals()方法相同,但是当我在运行时运算符期间创建两个相同的字符串= =说错。为什么会这样?

这是否意味着当我对相同的字符串进行硬编码时,它们会被放置在内存中的相同位置并且两个引用都指向它?我发现了类似的question,但没有明确的答案。

public class StringTesting {
    public static void main(String[] args){
        String string1 = "hello";                   //\
                                                    // } same place in the memory ?
        String string2 = "hello";                   ///

        System.out.println(string1 == string2);     //true
        System.out.println(string1.equals(string2));      //true

        String string3 = "hey";
        String string4 = "he";

        System.out.println(string3 == string4);          //false
        System.out.println(string3.equals(string4));     //false

        string4 += "y";

        System.out.println(string3 == string4);          //false ????
        System.out.println(string3.equals(string4));     //true

        System.out.println(string3 + " " + string4);      //hey hey
    }
}

3 个答案:

答案 0 :(得分:4)

以下复合赋值运算符:

string4 += "y";

在运行时执行字符串连接。由于string4的值仅在运行时计算。并且在运行时完成的字符串连接会创建一个新对象。

来自JLS Section 3.10.5(参见本节末尾):

  

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

但是,如果执行两个字符串文字的连接,则不会创建不同的对象。因此,以下代码将返回true

"he" + "y" == "hey";

该JLS部分包含各种字符串连接示例的代码段:

String hello = "Hello", 
String lo = "lo";

System.out.print((hello == "Hello") + " ");          // true
System.out.print((Other.hello == hello) + " ");      // true
System.out.print((other.Other.hello == hello) + " ");// true
System.out.print((hello == ("Hel" + "lo")) + " ");     // true
System.out.print((hello == ("Hel" + lo)) + " ");       // false
System.out.println(hello == ("Hel" + lo).intern());    // true

答案 1 :(得分:0)

string4 += "y";创建一个新对象。

然而,字符串文字与优化放在内存中的相同位置(这称为string interning)。

答案 2 :(得分:0)

string1string2string3都是字符串常量。即,它们在.class文件中显示为常量池条目。在Java中,字符串常量被实现。

string4是一个新字符串,通过将字符串常量"he"然后附加"y"来创建。因此,它不是字符串常量,也不是实习。

这就是string3 != string4

的原因