您的位置:首页 > 其它

源码分析五(HashSet的内部实现)

2014-10-15 22:31 375 查看
一:首先来看看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集合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: