这几个东西包括(==)都和“比较”相关,那么他们的关系是什么?
一.首先,最基础的是equals和==,前者对比内容,后者比较引用地址,很常用。
二. equals和hashCode。
相同点:1.都是Object的方法之一。2.都可以重写。
如果不重写的默认逻辑: 此时equals用的是==,即不重写equals,两个对象用equals比较和 用==比较是一样的效果。hashCode返回的是引用地址(其实这么说并不准确,反正两个内容相同的对象的默认hashCode一般不一样,可以简单理解为引用地址)
不同点: 前者可以通过A.equals(B)直接比较两个对象的内容是否相同,后者主要用于往hash集合(set或map)中存储时比较是否重复
易混点: 为什么说重写equals方法时,往往也要重写hashCode?
这跟 把对象往hash集合中存储时的逻辑 有关,关键一句源码【e.hash == hash && ((k = e.key) == key || key.equals(k))】,代码解释:hash集合判断两个对象一样的逻辑是 两个对象的hashCode一样 && (引用地址一样 || equals结果为true)。因为引用地址肯定不一样,这个逻辑就相当于 【hash一样 && equals一样】,而根据前面所说的 equals和hashCode的默认逻辑,可以看出只重写一个 和不重写 效果一样(这里的效果指的是在插入hash集合 判断重复的效果)
三. comparable和comparator。
相同点:
1. 都是接口,想使用时,都需要类去实现
2. 都是主要用于对象在集合中排序(这里指的是list集合或 数组)
不同点:
1. 类A实现comparable后,A的对象 自己就有了比较大小的功能;类B实现comparator后,类B成为了一个排序的工具comparator,这个工具可以对其他对象进行比较大小
2. 实现comparable后排序的写法: Collections.sort(list); 实现comparator后排序的写法:Collections.sort(list,comparator)
3. 类A实现comparable后,A的对象 自己就有了比较大小的功能,所以此时就可以: A.compareTo(B)进行比较大小。而实现comparator后没有这样的功能
优缺点:
1. comparable可以让对象自己有比较大小的功能而不需要其他工具帮助
2. comparator可以在无法改变原有类的逻辑的情况下 完成排序的功能(无侵入式)
参考连接:
Java中的equals(),==,compareTo()和compare()