Set是如何实现元素不重复的&重写equals()方法之后也必须重写hashCode()方法
2018-02-25 09:46
661 查看
参考:http://www.cnblogs.com/szlbm/p/5504623.html
http://lelglin.iteye.com/blog/1826152
一、HashCode 1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的 2、如果两个对象equals相等,那么这两个对象的HashCode一定也相同 3、如果对象的equals方法被重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值 4、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置
二、Set
举个实际的例子Set。我们知道Set里面的元素是不可以重复的,那么如何做到?Set是根据equals()方法来判断两个元素是否相等的。比方 说Set里面已经有1000个元素了,那么第1001个元素进来的时候,最多可能调用1000次equals方法,如果equals方法写得复杂,对比的 东西特别多,那么效率会大大降低。使用HashCode就不一样了,比方说HashSet,底层是基于HashMap实现的,先通过HashCode取一 个模,这样一下子就固定到某个位置了,如果这个位置上没有元素,那么就可以肯定HashSet中必定没有和新添加的元素equals的元素,就可以直接存 放了,都不需要比较;如果这个位置上有元素了,逐一比较,比较的时候先比较HashCode,HashCode都不同接下去都不用比了,肯定不一 样,HashCode相等,再equals比较,没有相同的元素就存,有相同的元素就不存。如果原来的Set里面有相同的元素,只要HashCode的生 成方式定义得好(不重复),不管Set里面原来有多少元素,只需要执行一次的equals就可以了。这样一来,实际调用equals方法的次数大大降低, 提高了效率。
http://lelglin.iteye.com/blog/1826152
一、HashCode 1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的 2、如果两个对象equals相等,那么这两个对象的HashCode一定也相同 3、如果对象的equals方法被重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值 4、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置
二、Set
举个实际的例子Set。我们知道Set里面的元素是不可以重复的,那么如何做到?Set是根据equals()方法来判断两个元素是否相等的。比方 说Set里面已经有1000个元素了,那么第1001个元素进来的时候,最多可能调用1000次equals方法,如果equals方法写得复杂,对比的 东西特别多,那么效率会大大降低。使用HashCode就不一样了,比方说HashSet,底层是基于HashMap实现的,先通过HashCode取一 个模,这样一下子就固定到某个位置了,如果这个位置上没有元素,那么就可以肯定HashSet中必定没有和新添加的元素equals的元素,就可以直接存 放了,都不需要比较;如果这个位置上有元素了,逐一比较,比较的时候先比较HashCode,HashCode都不同接下去都不用比了,肯定不一 样,HashCode相等,再equals比较,没有相同的元素就存,有相同的元素就不存。如果原来的Set里面有相同的元素,只要HashCode的生 成方式定义得好(不重复),不管Set里面原来有多少元素,只需要执行一次的equals就可以了。这样一来,实际调用equals方法的次数大大降低, 提高了效率。
相关文章推荐
- 判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示
- 为什么在重写了equals()方法之后也必须重写hashCode()方法
- 正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
- 重写了equals()方法之后也必须重写hashCode()方法
- 为什么在重写了equals()方法之后也必须重写hashCode()方法
- 为什么在重写了equals()方法之后也必须重写hashCode()方法
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
- 为什么在重写了equals()方法之后也必须重写HashCode()方法
- 判断Set里的元素是否重复、==、equals、hashCode方法研究-代码演示
- HashSet中的元素必须重写equals方法和hashCode方法
- 深入详解SetHash的元素为什么要重写hashCode和equals方法
- 为什么在重写了equals()方法之后也必须重写hashCode()方法
- 重写javascript的Array.prototype.push方法实现类似java.util.set添加不重复元素
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
- 重写equals方法之后,是否需要重写hashCode方法
- Set如何实现“没有重复元素”
- java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- Set是如何实现"没有重复元素"