java中的不可变字符串

时间:2013-05-01 16:20:24

标签: java string immutability

为什么这会打印成真:

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");

它们不应该都打印错误吗?...我理解字符串是不可变的,但我不明白为什么不用构造函数初始化导致不同的输出

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分: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