构造方法
1 | * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has |
很明显,HashSet底层是hashmap存储的。借大神的话
HashSet 就是HashMap的马甲 —–someone
很形象哈。
add()方法
1 | // Dummy value to associate with an Object in the backing Map |
add方法的参数(要存储的value)作为HashMap的key,PRESENT(Object PRESENT = new Object();)
作为固定value。
key
HashMap中的put方法
1 | public V put(K key, V value) { |
这里边有两个看点:
- HashMap中key存储是hash后的值,对于String类型的相同值的hash值是一致的(其他接触类型类似,自定义对象类型需要重写hashcode方法与equel方法)。换句话说相同的值在hashMap中的存储位置是一样的。
- 基于上一点来看看怎么存储重复值的。如下代码对于hashMap中已经存在的key,key不变,新value覆盖就value。对于HashSet而言新旧value都是PRESENT对象,所以set在存储的时候就不会重复。
1 | if (e != null) { // existing mapping for key |
所以hashset中存储的值输出的顺序和存储的先后顺序不一致,而是按照值的hash顺序输出。
总结:
通过分析HashSet的实现原理,可以肯定的是它的去重效率是很高的,前提是去重对象需要有hashcode、equel方法的实现。除此外HashMap所拥有的大多数特性都适用于HashSet。
本文整理自
仅做个人学习总结所用,遵循CC 4.0 BY-SA版权协议,如有侵权请联系删除!