为什么这会打印成真:
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");
它们不应该都打印错误吗?...我理解字符串是不可变的,但我不明白为什么不用构造函数初始化导致不同的输出
答案 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