我知道这已被涵盖,但我在这里看到关于 SO 的不一致论点。
如果我有:
String a = "apple2e";
String b = "apple2e";
System.out.println("a==b? " + a == b);
我得到了错误。
据我了解,这是因为 a
和 b
是对同一对象 (apple2e
) 的两个不同引用。
所以我会有这样的东西:
a (reference_id 123) ------
--------- "apple2e"
b (reference_id 456) ------
现在,如果我只想比较两个字符串的内容,我会使用a.equals(b)
这是否意味着如果两个引用指向同一个对象,JVM 只是简单地返回?所以它不是真的在逐字比较吗?
谢谢
编辑
拿着电话。感谢 delnan
指出 +
优先级!!!
当我将其更改为:
System.out.println(a == b);
我确实得到了 true
。
这更有意义。
编辑 2
我不敢相信我没听清楚。哈哈
我在做:
"a==b? " + a == b
转化为
"a==b? apple2e" == "apple2e"
难怪是假的!!
最佳答案
As I understand it, it's because a and b are two different references to the same object (apple2e).
因为字符串驻留,仅因为字符串驻留 a
和 b
是对同一个 String
对象的不同引用。
不幸的是,您的代码并没有按照您的想法行事。试试这个:
String a = "apple2e";
String b = "apple2e";
System.out.println("a==b? " + a == b); // "false"
System.out.println("a==b? " + (a == b)); // "a==b? true"
Java 自动实习所有字符串文字。 这 就是为什么第二个 sysout 打印它所做的事情。第一个 sysout 只打印 "false"
因为字符串连接 ( +
) 的优先级高于 ==
,所以它等同于:
System.out.println("a==b? apple2e" == "apple2e");
我不认为那是你想要测试的!
另一方面,这将为您提供两个独立的 String
实例:
String a = new String("apple2e");
String b = new String("apple2e");
System.out.println("a==b? " + (a == b)); // "a==b? false"
这看起来像
a (reference_id 123) --------------- "apple2e"
b (reference_id 456) --------------- "apple2e"
并且可以使用 String#intern()
还原到原来的情况:
String a = new String("apple2e").intern();
String b = new String("apple2e").intern();
System.out.println("a==b? " + (a == b)); // "a==b? true"
例如
a (reference_id 123) ------+
+--------- "apple2e"
b (reference_id 456) ------+
关于java - Java 中 == 和 .equals 的区别。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6864948/