1

这怎么会是真的:

String sOne = new String();
sOne = "one";
String sTwo = new String();
sTwo = "one";
System.out.println(sOne == sTwo ? "true": "false");

但这打印错误:

String sOne = new String("one");
String sTwo = new String("one");
System.out.println(sOne == sTwo ? "true": "false");

他们不应该都打印假吗?...我知道字符串是不可变的,但我不明白为什么不使用构造函数初始化会导致不同的输出

4

2 回答 2

7

因为字面量在它出现的任何地方都"one"引用同一个 String 对象;字符串文字总是被实习的。第一个示例中的两个变量将引用同一个对象。

在第二种情况下,您强制在两个赋值中构造一个的字符串对象,因此字符串相等但实例不同;这两个变量引用等效但不同的对象。

该表达式sOne.equals(sTwo)在两个示例中都应返回 true,因为它将对字符串内容执行相等测试。

于 2013-05-01T16:23:11.630 回答
1

在 Java 中,如果您像在 C x == y 中那样进行比较,则比较对象(即指针),但不比较它们的内容。这就是为什么您需要使用 obj.equals(other_obj) 来确保它们在功能上是相同的对象。这类似于比较 C 中的指针。如果指针相同,则您正在查看同一个对象。如果指针不同,这两个对象仍然可以具有相同的值,但它们是不同的对象。

    String v1 = "Test";
    String v2 = v1;

    if(v1 == v2)
        System.out.println("1true");

    v2 = "Test"; // referencing the same object
    if(v1 == v2)
        System.out.println("2true");
    if(v1.equals(v2))
        System.out.println("3true");

    v2 = new String("Test");  // new object/pointer same content
    if(v1 == v2)
        System.out.println("4true");
    if(v1.equals(v2))
        System.out.println("5true");

输出:

1true
2true
3true
5true
于 2013-05-01T16:32:25.257 回答