【发布时间】:2016-01-01 18:37:43
【问题描述】:
我正在学习 OCA 8 认证。 Java中的“逻辑相等”是什么意思?
我有这种情况:
String s1 = new String("java");
String s3 = new String("java");
StringBuilder s2 = new StringBuilder("java");
StringBuilder s4 = new StringBuilder("java");
if (s1 == s2) { System.out.print("1"); } //error
if (s1.equals(s2)) { System.out.print("2"); } //false
if (s1.equals(s3)) { System.out.print("3"); } //true
if (s2.equals(s4)) { System.out.print("4"); } //false
部分:
对象String 上的方法equals() 被重新定义以将对象的值与另一个对象的值进行比较。因此,当我执行该行时:
if (s1.equals(s3)) { System.out.print("3"); }
我有结果 3。
在对象StringBuilder 上,方法equals() 未重新定义,因此它将比较对象引用是否相等。因此,当我执行代码行时:
if (s2.equals(s4)) { System.out.print("4"); }
我有结果false。
我的问题是:
- 为什么我执行
if(s1 == s2)时会出现编译错误? - 为什么我执行
s1.equals(s2)是假的?
【问题讨论】:
-
您查看过第一部分的编译器错误吗?您不理解错误消息的哪一部分?对于第二个问题,您为什么希望
StringBuilder等于String? -
我已经阅读了编译器错误(它说它们是 2 个不同的对象)。出于这个原因,我在询问 java 中的逻辑平等。我没有例外 2 对象将相等,但我假设我需要创建 2 个对象的情况,定义相同的方法(其中一个查找值相等,另一个查找引用相等)
-
如果您没想到这两个对象会相等,我不明白您为什么要问第二个问题。恐怕您的评论通常不清楚:(
标签: java string equals stringbuilder