写在前面: 标题中说得不清楚,equals方法想表达的是hashcode方法和equals方法这类在Hash相关操作会用到的方法,而compare方法指在TreeSet,TreeMap以及需要比较比如Arrays.sort()方法中会用到的方法。下面详细说明一下
集合框架中的体系结构:
java.util.Collection
-->List
-->ArrayList LinkedList vector
-->Set
-->HashSet LinkedHashSet TreeSet
java.util.Map
-->HashMap LinkedHashMap TreeMap
List的特点:有序可重复
Set的特点:无序不可重复
equals的使用
在Collection接口中有一些抽象方法比如Contains,这些方法要求比较每个元素的相等关系,所以要求放入Collection中的元素所在类必须重写equals方法。
在HashMap中的key构成了一个Set(无序不可重复),可以调用keySet()方法得到;value构成一个Collection(无序但可重复),可以调用values()得到;(key,value)构成一个Set(无序不可重复),可以调用entrySet()得到
在HashMap和HashSet等与Hash有关的类在插入元素时,需要得到元素对应的hash值,也需要判断两个元素是否相等(equals),所以要求key和value都重写hashcode, equals两个方法(其实key两个都要求重写,value可以只重写equals,但是不方便记忆,直接都重写了)
对于TreeSet和TreeMap,都是不可重复的,在添加元素时也需要比较新元素和旧元素是否相等,所以也需要重写equals方法
compare的使用
比较大小有两种方法,一个是在定义类的时候实现comparable接口并重写compareTo方法,这叫做默认排序。如果无法修改类的代码就可以创建一个Comparator实现类的对象,要求重写compare方法,在需要的地方传入这个比较器,这叫做定制排序。
而在集合框架中TreeSet, TreeMap两个类中数据按红黑树存储,是需要按元素大小进行排序的,所以要求类实现comparable接口或者传入比较器。这个时候就不用数组存储,也就不用重写hashcode()方法了。
注意:在HashMap中也用到了红黑树,但是HashMap中的元素不要求可比较,原因是在HashMap中是按照hashcode值来存储的,只是方便在链表中元素过多时查找或添加删除元素。关于HashMap中红黑树及相应扩容机制可以查看这篇文章。
总结
需要重写equals()方法的:只要是使用集合框架都需要重写
需要重写hashcode()方法的:只要是有Hash的都需要重写
需要重写compareTo()或者传入比较器的:只要是有Tree的都需要