我正在研究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
部分:
重新定义对象equals()
上的方法String
,以将对象的值与另一个值进行比较。出于这个原因,我排除了这一行:
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)
这是假的?答案 0 :(得分:4)
- 为什么当我执行if(s1 == s2)我将是编译错误?
==
运算符是reference equality operator。引用JLS:
如果无法通过强制转换(§5.5)将任一操作数的类型转换为另一种操作数的类型,那么这是一个编译时错误。
在您的情况下,两个操作数的类型为String
和StringBuilder
,它们不兼容:String
无法转换为StringBuilder
和副String
-versa。
- 为什么当我超越s1.equals(s2)时它是假的?
StringBuilder
和equals()
是两种不同的类型。 String
中的String
方法检查给定的参数是否也是String
类型,这不是这里的情况,因此StringBuilder
的实例永远不能等于 Command: /path/to/ffmpeg inputFile.MOV -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -preset slow -crf 22 -movflags +faststart outputFile.mp4
的实例。
答案 1 :(得分:1)
- 为什么当我执行if(s1 == s2)我将是编译错误?
- 为什么当我超越s1.equals(s2)时它是假的?
醇>
String
不是StringBuilder
。您将获得"不兼容的操作数类型String和StringBuilder" (因为String
不是StringBuilder
)。String
不是StringBuilder
。您可以使用s1.equals(s2.toString())
(true
)。答案 2 :(得分:0)
我只是发现原因here。
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 }
我之所以感到困惑,因为equals方法采用了像参数这样的对象(为此我认为它被视为方法中的对象,但我发现它是第二个if条件仅适用于字符串对象(在这里我找到了关于逻辑平等的问题的回答)。 向所有人致谢