java - Java 中 == 和 .equals 的区别。

标签 java comparison reference

我知道这已被涵盖,但我在这里看到关于 SO 的不一致论点。

如果我有:

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

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

我得到了错误

据我了解,这是因为 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"

难怪是假的!!

最佳答案

As I understand it, it's because a and b are two different references to the same object (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 打印它所做的事情。第一个 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/

相关文章:

java - Java 中的静态 block 未执行

c++ - 为什么不可能有对void的引用?

c++ - 为什么引用 unique_ptr 会这样?

javascript - 在 JavaScript 中比较字符串的最佳方法?

c++ - 了解返回字符串引用的函数中的 "const"

java - 是否可以使基于 Swing 的应用程序独立于屏幕分辨率

java - 在 JBoss 中使用代理服务器配置 Websphere MQConnectionFactory

java - 如何构建符合 fips 的 sqlcipher 来调用 FIPS_mode_set(1)

string - 如何在混合元胞数组中找到某个字符串并将其替换为整数?

Python:比较具有不同键的两个计数器对象