为什么重写equals一定要重写hashCode
2016-09-13 13:53
302 查看
一、为什么要有Hash算法
Java中的集合有两类,一类是List,一类是Set。List内的元素是有序的,元素可以重复。Set元素无序,但元素不可重复。要想保证元素不重复,两个元素是否重复应该依据什么来判断呢?用Object.equals方法。但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说若集合中已有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是Java采用了哈希表的原理。哈希(Hash)是个人名,由于他提出哈希算法的概念就以他的名字命名了。
二、Hash算法原理
当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。
确实提高了效率。但一个面临问题:若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。
2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
转自:http://blog.csdn.net/woshixuye/article/details/8189398
Java中的集合有两类,一类是List,一类是Set。List内的元素是有序的,元素可以重复。Set元素无序,但元素不可重复。要想保证元素不重复,两个元素是否重复应该依据什么来判断呢?用Object.equals方法。但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说若集合中已有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是Java采用了哈希表的原理。哈希(Hash)是个人名,由于他提出哈希算法的概念就以他的名字命名了。
二、Hash算法原理
当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。
确实提高了效率。但一个面临问题:若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。
2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
转自:http://blog.csdn.net/woshixuye/article/details/8189398
相关文章推荐
- 【Java基础之重写equals、hashCode和compareTo方法】什么时候需要重写重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 0073 为什么重写equals方法,一定要重写HashCode方法【基础】
- 为什么重写了equals,就一定要再重写hashCode
- Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法?
- 为什么要重写了equals方法后一定要重写hashcode方法
- 为什么重写equals方法,一定要重写HashCode方法?(
- 为什么重写equals方法,一定要重写HashCode方法?
- 什么时候需要重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 重写equals方法为什么一定要重写hashcode方法
- Java中为什么重写equals()就一定要重写hashCode()?
- 为什么重写equals方法,一定要重写HashCode方法?
- 为什么重写equals方法,一定要重写HashCode方法
- 关于object类的两个重要方法以及为什么重写equals一定要重写hashcode()
- 为什么重写 equals 的时候一定要重写 hashCode?
- 为什么要重写equals方?重写equals方法一定要重写HashCode方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- Java基础之重写equals方法的同时为什么要重写hashCode方法
- 为什么要重写hashCode()方法和equals()方法及如何重写