equals方法
在java的Object类中,equals()比较的是两个对象的引用地址,如果是基本数据类型比较的就是值。
为什么说重写equals方法后一定要重写hashcode方法?
我的理解就是 ,当在使用HashSet(这里只拿HashSet展开)的去重机制时,他会将存入HashSet的元素进行去重处理,那么是如何进行去重的呢?HashSet底层用的是Hash表的一种数据结构(一个元素为链表的数组)
他会首先判断要添加的元素的hash值,同过hash值的计算算出该元素在其底层数组中的索引,查看索引处是否存在元素,如果存在则使用equals方法,如果为true则不添加,如果为false则添加在次索引处。
1 | 整理一下差不多如下 |
此时如果我定义一个Student类,只重写equals方法如下代码
1 | class Student{ |
1 | Student student1 = new Student(1,"张三"); |
发现其equals相同,而hashcode是不相同的,因为他调用的是父类Object的hashCode方法,而equals相同而hashcode值不同,这样在HashSet集合中是不允许的,因为他先判断其hashCode值,发现不相同就直接插入在集合中了,达不到去重的效果,所以重写了equals方法一定要重写hashCode方法
1 | //它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置(实际上不是,这里写是便于理解)。 |
有关hashCode的规定:
- 两个对象相等,其hashcode值一定相同;
- 两个对象不相等,其hashcode值有可能相同;
- hashcode相同的两个对象,不一定相等;
- hashcode不相同的两个对象,一定不相等;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hobo's blog!
评论