源码分析五(HashSet的内部实现)
2014-10-15 22:31
375 查看
一:首先来看看Hashset的继承体系
继承AbstractSet类,实现Set接口
set接口继承Collection接口,所以可以迭代,集合的方法它都有,下面来看一下set接口:
集合HashSet元素不可以重复,而且是有序的,因为它的底层维护了HashMap类的key值
当使用构造器new一个HashSet的对象时,实际上创建了一个HashMap对象。
二:再来看看HashSet类中的方法:
三:总结
其实HashSet类的用法很简单,底层实现就是维护一个Hashmap,Hashset类的元素维护在Hashmap的key位置上,
value是一个常量值,因为Hashmap的key是不可重复的,有序的,所以Hashset也具有这样的特性,在涉及到排序
或者去重等问题时,可以考虑使用Hashset集合。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
继承AbstractSet类,实现Set接口
set接口继承Collection接口,所以可以迭代,集合的方法它都有,下面来看一下set接口:
public interface Set<E> extends Collection<E> { // 集合中元素数量 int size(); // 判断集合是否为空 boolean isEmpty(); //判断是否包含指定元素 boolean contains(Object o); //调用该方法可以产生迭代器,这个方法继承自Iterable接口 Iterator<E> iterator(); //将集合转换为数组,这个方法时集合和数组之间的桥梁 Object[] toArray(); //将集合转换为指定类型的数组 <T> T[] toArray(T[] a); //向集合中添加元素 boolean add(E e); //删除集合中的指定元素 boolean remove(Object o); //判断是否包含指定集合中的所有元素 boolean containsAll(Collection<?> c); //将指定集合中的元素添加到集合中 boolean addAll(Collection<? extends E> c); //保留指定集合中的所有元素,就是集合中其他的元素删除 boolean retainAll(Collection<?> c); //删除指定集合中的所有元素 boolean removeAll(Collection<?> c); //清空集合中所有元素 void clear(); }
集合HashSet元素不可以重复,而且是有序的,因为它的底层维护了HashMap类的key值
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<E,Object>(); }
当使用构造器new一个HashSet的对象时,实际上创建了一个HashMap对象。
二:再来看看HashSet类中的方法:
//迭代HashSet中的元素,实际上是迭代HashMap的key值 public Iterator<E> iterator() { return map.keySet().iterator(); }
//HashSet集合中元素size就是map集合中元素数量 public int size() { return map.size(); }
//判断是否为空,也是判断map是否为空 public boolean isEmpty() { return map.isEmpty(); }
//判断Hashset集合是否包含指定元素就是判断map中是否包含指定的key值 public boolean contains(Object o) { return map.containsKey(o); }
//向集合中添加元素就是向map中put元素,key就是元素,value是一个常量值 public boolean add(E e) { return map.put(e, PRESENT)==null; } private static final Object PRESENT = new Object();
//移除指定元素,就是删除map中的key-value映射 public boolean remove(Object o) { return map.remove(o)==PRESENT; }
//清空HashSet集合中元素就是清空map集合 public void clear() { map.clear(); }
三:总结
其实HashSet类的用法很简单,底层实现就是维护一个Hashmap,Hashset类的元素维护在Hashmap的key位置上,
value是一个常量值,因为Hashmap的key是不可重复的,有序的,所以Hashset也具有这样的特性,在涉及到排序
或者去重等问题时,可以考虑使用Hashset集合。
相关文章推荐
- PAM 的应用开发和内部实现源码分析
- HashSet实现原理及源码分析
- HashMap内部实现及源码分析
- HashSet和HashMap源码实现分析
- CoreCLR源码探索(四) GC内存收集器的内部实现 分析篇
- java集合之set集合的实现类HashSet源码分析
- jQuery().end()的内部实现及源码分析
- Hadoop跨集群数据拷贝工具DISTCP内部源码实现分析
- Kubernetes ResourceQuotaController内部实现原理及源码分析
- HashSet实现原理及源码分析
- redis源码分析 dict字典的实现和内部应用
- 第二人生的源码分析(5)类Log的实现
- 第二人生的源码分析(10)登录授权的实现过程
- 第二人生的源码分析(4)Log调试功能的实现
- 第二人生的源码分析(11)地面显示的实现
- Delphi.NET 内部实现分析(5)
- 栈与递归的实现:n阶Hanoi塔的算法分析与源码
- 应用框架的设计与实现——.NET平台(10 授权服务.源码分析)
- 第二人生的源码分析(6)类CallSite的实现
- 第二人生的源码分析(4)Log调试功能的实现