-1

我有这个我无法理解的代码。一开始你可以看到两个相同的字符串,当我将它们与操作符的使用进行比较时,==它说它是真的,与equals()方法相同,但是当我在运行时创建两个相同的字符串时,操作符 == 说是假的。为什么会这样?

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

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
    }
}
4

3 回答 3

4

以下复合赋值运算符:

string4 += "y";

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

JLS 第 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
于 2013-08-23T21:53:22.083 回答
0

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

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

于 2013-08-23T21:52:02.433 回答
0

string1, string2, 和string3都是字符串常量。即,它们在.class文件中显示为常量池条目。在 Java 中,字符串常量是实习的。

string4是一个新字符串,通过获取字符串常量"he"然后附加"y". 因此,它不是一个字符串常量,也不是实习生。

这就是为什么string3 != string4

于 2013-08-23T21:52:02.760 回答