equals,hashcode,comparable,comparator

来源:互联网 发布:wifi中间人攻击软件 编辑:程序博客网 时间:2024/05/21 10:21

这几个东西包括(==)都和“比较”相关,那么他们的关系是什么?

一.首先,最基础的是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可以在无法改变原有类的逻辑的情况下 完成排序的功能(无侵入式)


参考连接:

hashCode与equals的区别与联系

 Java中的equals和hashCode方法详解

Java中的equals(),==,compareTo()和compare()

Comparable与Comparator的区别

      

原创粉丝点击