逻辑平等与对象参考平等

时间:2016-01-01 18:37:43

标签: 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"); } //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)这是假的?

3 个答案:

答案 0 :(得分:4)

  
      
  • 为什么当我执行if(s1 == s2)我将是编译错误?
  •   

==运算符是reference equality operator。引用JLS:

  

如果无法通过强制转换(§5.5)将任一操作数的类型转换为另一种操作数的类型,那么这是一个编译时错误。

在您的情况下,两个操作数的类型为StringStringBuilder,它们不兼容:String无法转换为StringBuilder和副String -versa。

  
      
  • 为什么当我超越s1.equals(s2)时它是假的?
  •   

StringBuilderequals()是两种不同的类型。 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)

  
      
  1. 为什么当我执行if(s1 == s2)我将是编译错误?
  2.   
  3. 为什么当我超越s1.equals(s2)时它是假的?
  4.   
  1. 是。因为String不是StringBuilder。您将获得"不兼容的操作数类型String和StringBuilder" (因为String不是StringBuilder)。
  2. 同样,因为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条件仅适用于字符串对象(在这里我找到了关于逻辑平等的问题的回答)。 向所有人致谢