要懂抽象,也要懂是如何产生抽象。
课上学到,在Java中,“==”比较的是两个对象的地址是否相同,想要比较行为等价性需要使用equals()方法,而所有数据类型的equals()方法都继承自Object类的equals方法,相当于“==“,为了实现对ADT行为等价性的判断需要我们override equals()。
那么自然产生的一个问题是,Java给我们提供的一些常用数据结构,如Set和List的equals方法是否重写了呢,如果重写又是如何实现的呢?
写一段简单的代码,比较两个Set<Integer>
import java.util.*; public class settest { public static void main(String[] args) { HashSet<Integer> set1 =new HashSet<>(); HashSet<Integer> set2 = new HashSet<>(); if(set1.equals(set2)){ System.out.println("equal"); } } }
输出为equal,可见其equals()已经重写过了,接下来开始探究其具体的实现。经查找资料发现List的equals()实现逻辑是对两个List中的对应元素依次调用其自身的equals()方法。
List是有序的,这样的实现逻辑很好理解,那么无序的Set又是怎样呢?为此我查看了其源码AbstractSet.java
public boolean equals(Object o) { if (o == thi