Java集合类——HashSet
2017-05-21 20:44
99 查看
HashSet实现了Set接口,Set中不能记住元素的添加顺序,不允许包含相同的元素,如果试图把两个相同的元素加入到Set中,将会添加失败,add()方法返回false,新元素也不会加入集合中。
HashSet是Set的一个实现类,因为是按照Hash算法来存储元素,所以在查找和存取上有很好的性能。HashSet的特点:
|-不能保证元素的排列顺序;
|-HashSet不是同步的,如果有多个线程要访问一个HashSet,需要进行同步操作;
|-HashSet中元素的值可以是null。
HashSet的底层实现机制是HashMap:
public HashSet() {
map = new HashMap<>();
}
当执行add()方法时,HashSet的元素放在HashMap的Key中,HashMap的值统一是PRESENT,PRESENT的定义方式如下:
private static final Object PRESENT = new Object();
add()方法的实现如下:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap调用put()方法时,遇到重复的Key值会覆盖,用新的value替换旧的value,而HashSet的元素保存在Key中,重复的元素被覆盖,所以HashSet的元素是不会重复的。
需要注意,如果重写了equals()方法,就必须同时重写hashCode()方法,使得两个对象使用equals()方法比较返回true时,两个对象的hashCode值也相同。
如果两个对象通过equals()方法返回true,但两个对象的hashCode值不同,这时HashSet将会把这两个对象保存在Hash表的不同位置,使这两个对象都添加成功。
如果两个对象的hashCode()方法返回的hashCode值相同,但通过equals()方法比较反悔了false,这时,因为两个对象HashCode值相同,HashSet试图把两个对象保存在同一位置,但又不行,所以实际上会在这个位置上使用链式结构来保存多个对象。
HashSet是Set的一个实现类,因为是按照Hash算法来存储元素,所以在查找和存取上有很好的性能。HashSet的特点:
|-不能保证元素的排列顺序;
|-HashSet不是同步的,如果有多个线程要访问一个HashSet,需要进行同步操作;
|-HashSet中元素的值可以是null。
HashSet的底层实现机制是HashMap:
public HashSet() {
map = new HashMap<>();
}
当执行add()方法时,HashSet的元素放在HashMap的Key中,HashMap的值统一是PRESENT,PRESENT的定义方式如下:
private static final Object PRESENT = new Object();
add()方法的实现如下:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashMap调用put()方法时,遇到重复的Key值会覆盖,用新的value替换旧的value,而HashSet的元素保存在Key中,重复的元素被覆盖,所以HashSet的元素是不会重复的。
需要注意,如果重写了equals()方法,就必须同时重写hashCode()方法,使得两个对象使用equals()方法比较返回true时,两个对象的hashCode值也相同。
如果两个对象通过equals()方法返回true,但两个对象的hashCode值不同,这时HashSet将会把这两个对象保存在Hash表的不同位置,使这两个对象都添加成功。
如果两个对象的hashCode()方法返回的hashCode值相同,但通过equals()方法比较反悔了false,这时,因为两个对象HashCode值相同,HashSet试图把两个对象保存在同一位置,但又不行,所以实际上会在这个位置上使用链式结构来保存多个对象。
相关文章推荐
- java集合类深入分析之HashSet, HashMap篇
- java集合类,List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet),Map集合比较
- java集合类(五)HashSet与TreeSet应用实例
- Java集合类HashSet、TreeSet比较
- 搞懂JAVA集合类--HashSet, LinkedHashSet, TreeSet(五)
- Java集合类----HashSet的实现原理
- Java集合类4—HashSet、TreeSet、HashMap、TreeMap介绍
- 浅析Java集合类源码(二)--- HashSet, HashMap, Hashtable
- Java集合类HashSet实现细节
- 【Java集合类】HashSet解析
- java中HashSet有什么用,举例说明?
- 详细整理ArrayList、Hashtable、Vector、HashSet、HashMap初始大小、加载因子、扩容方式
- 建立HashSet的实例,依次填入三个名字判断实例中是否存在"Kobe"
- [面试必看]Java集合类学习整理
- HashMap与HashSet的高级用法
- 了解C#中的HashSet与示例
- 为什么使用HashSet储存对象时必须重写equals和hashcode方法
- 深入Collection集合的孙子接口HashSet
- 深入Collection集合的孙子接口HashSet
- 深入Collection集合的孙子接口HashSet