我知道已经解决了这个问题,但是我在SO上看到了不一致的论点。
所以,如果我有:
String a = "apple2e"; String b = "apple2e"; System.out.println("a==b? " + a == b);
我得到 FALSE 。
据我了解,这是因为a和b是对同一对象(apple2e)的两个不同引用。
a
b
apple2e
所以我会有类似的东西:
a (reference_id 123) ------ --------- "apple2e" b (reference_id 456) ------
现在,如果我只想比较两个字符串的 内容 ,我将使用a.equals(b)
a.equals(b)
这是否意味着如果两个引用指向同一个对象,JVM就会简单地返回?因此,它不是在逐个字符地进行比较吗?
谢谢
编辑
拿着电话。感谢delnan您指出+优先顺序!!!
delnan
+
当我将其更改为:
System.out.println(a == b);
我确实得到了true。
true
这更有意义。
编辑2
我不敢相信我没有抓住。大声笑
我在做:
"a==b? " + a == b
转化为
"a==b? apple2e" == "apple2e"
难怪这是假的!
因为使用字符串实习,并且 仅 因为使用字符串实习a而b对同一String对象的引用不同。
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打印其功能的原因。仅"false"因为字符串连接(+)的优先级高于==,才输出第一个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#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) ------+