关于Arrays.equals()的一点疑惑

时间:2021-02-14 16:24:09
import java.util.*;

public class Test {
  public static void main(String[] args) {
    S[] s1 = new S[5];
    S[] s2 = new S[5];
    S t1 = new S();
    S t2 = new S();

    Arrays.fill(s1, t1);
    Arrays.fill(s2, t2);

    System.out.println(Arrays.equals(s1, s2));
    System.out.println(t1.equals(t2));
  }
}

class S {
  int i = 0;
  boolean equals(S b) {
    if(this.i == b.i)
      return true;
    return false;
  }
}

/*程序的输出是:
false
true

可我在《thinking in java》上看到是这样介绍Arrays.equals()的:
“为了能比较数组是否完全相等,Arrays提供了经重载的equals()方法。当然,也是针对各种primitive以及Object的。两个数组要想完全想等,它们必须有相同数量的元素,而且数组的每个元素必须与另一个数组的相对应位置上的元素相等。-->元素的相等性,用equals()判断<-- ”

最后那句话的意思不是说,当Arrays.equals()方法的参数为对象数组时,它会调用此类对象的equals()方法吗?可是我已经重载了呀,怎么输出还是False呢?
或者,Arrays.equals()调用的只是根类的equals方法呢?
*/

5 个解决方案

#1


没有复写equals方法,改成下面的
class S {
    int i = 0;

    public boolean equals(Object b) {
        if (this.i == ((S)b).i)
            return true;
        return false;
    }
}

#2


你在S 中定义的方法是错误的,你是新定义了一个equals方法,而不是覆盖了Object.equals方法
应该是

  boolean equals(Object obj) {
    if(!obj instanceof S) return false;
    S b = (S) obj;
    if(this.i == b.i)
      return true;
    return false;
  }

#3


刚才又查了下JDK,这么说的:

Two objects e1 and e2 are considered equal if (e1==null ? e2==null : e1.equals(e2)).

所以正想着是不是我的代码有问题呢,谢谢楼上两位,多谢

#4


Arrays.fill(s1, t1);
Arrays.fill(s2, t1);
System.out.println(Arrays.equals(s1, s2));

他是这个意思!

#5


ChDw(米)的也有问题
equals是public,不能缩小可见性

#1


没有复写equals方法,改成下面的
class S {
    int i = 0;

    public boolean equals(Object b) {
        if (this.i == ((S)b).i)
            return true;
        return false;
    }
}

#2


你在S 中定义的方法是错误的,你是新定义了一个equals方法,而不是覆盖了Object.equals方法
应该是

  boolean equals(Object obj) {
    if(!obj instanceof S) return false;
    S b = (S) obj;
    if(this.i == b.i)
      return true;
    return false;
  }

#3


刚才又查了下JDK,这么说的:

Two objects e1 and e2 are considered equal if (e1==null ? e2==null : e1.equals(e2)).

所以正想着是不是我的代码有问题呢,谢谢楼上两位,多谢

#4


Arrays.fill(s1, t1);
Arrays.fill(s2, t1);
System.out.println(Arrays.equals(s1, s2));

他是这个意思!

#5


ChDw(米)的也有问题
equals是public,不能缩小可见性