小编典典

Java中==和.equals之间的区别。

java

我知道已经解决了这个问题,但是我在SO上看到了不一致的论点。

所以,如果我有:

String a = "apple2e";
String b = "apple2e";

System.out.println("a==b? " + a == b);

我得到 FALSE

据我了解,这是因为ab是对同一对象(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"

难怪这是假的!


阅读 210

收藏
2020-11-23

共1个答案

小编典典

据我了解,这是因为a和b是对同一对象(apple2e)的两个不同引用。

因为使用字符串实习,并且 因为使用字符串实习ab对同一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 ,因此它等效于此:

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) ------+
2020-11-23