Java 逻辑相等与对象引用相等
我正在学习OCA 8认证。在Java中,“逻辑平等”是什么意思 我有这个案子:Java 逻辑相等与对象引用相等,java,string,equals,stringbuilder,Java,String,Equals,Stringbuilder,我正在学习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"); } //er
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
我的问题是:
- 为什么当我执行
时,我会得到一个编译错误如果(s1==s2)
- 为什么当我计算s1.equals(s2)时它是假的
String
不是StringBuilder
。您将得到“操作数类型String和StringBuilder不兼容”(因为String
不是StringBuilder
)String
不是StringBuilder
。您可以使用s1.equals(s2.toString())
(即true
)- 为什么当我执行if(s1==s2)时,我将是一个编译错误
=
运算符是一个。引用JLS:
如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型(§5.5),则为编译时错误
在您的情况下,这两个操作数的类型为String
和StringBuilder
,它们不兼容:不能将String
转换为StringBuilder
,反之亦然
- 为什么当我超越s1.equals(s2)时它是假的
String
和StringBuilder
是两种不同的类型。String
中的equals()
方法检查给定的参数是否也是String
类型,这里不是这种情况,因此String
的实例永远不能等于StringBuilder
的实例。我刚刚发现了原因
由于equals方法采用了类似对象的参数,我感到困惑(为此,我认为它在方法中被视为对象,但我发现这是第二个if条件,它只适用于String对象(在这里,我找到了关于逻辑相等性问题的答案)。
Thnk to all您是否查看了第一部分的编译器错误?您不了解错误消息的哪一部分?对于第二个问题,您为什么希望
StringBuilder
等于String
?我已经阅读了编译器错误(它说它们是两个不同的对象).出于这个原因,我询问了java中的逻辑相等问题。我不排除2对象将相等,但我支持这样一种情况,即我需要创建2个对象,定义相同的方法(其中一个查找值相等,另一个查找引用相等)如果你不期望这两个对象是相等的,我不明白你为什么问第二个问题。恐怕你的评论一般不清楚:(当我需要考虑2个不同的对象的平等或不平等的情况吗?)
1012 public boolean equals(Object anObject) {
1013 if (this == anObject) {
1014 return true;
1015 }
1016 if (anObject instanceof String) {
1017 String anotherString = (String)anObject;
1018 int n = count;
1019 if (n == anotherString.count) {
1020 char v1[] = value;
1021 char v2[] = anotherString.value;
1022 int i = offset;
1023 int j = anotherString.offset;
1024 while (n-- != 0) {
1025 if (v1[i++] != v2[j++])
1026 return false;
1027 }
1028 return true;
1029 }
1030 }
1031 return false;
1032 }