HashSet的底层数据结构
(2012-11-22 13:23:03)
标签:
hashset杂谈 |
1、HashSet的部分源码:
public class HashSet extends AbstractSet implements Set,
Cloneable,Serializable {
private transient HashMap map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap();
}
public Iterator iterator() {
return map.keySet().iterator();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
}
2、HashSet的特点:
1)由HashSet的源码可知,HashSet底层就是一个HashMap。我们在往HashSet中存储数据的时候,存的都是HashMap的键(key),
它们的值(value)都是一样的:private static final Object PRESENT = new
Object()。
2)HashSet底层的数据结构是一个哈希表,存在HashSet中的元素应该重写其hashCode()方法,故存在HashMap中的key,应该
重写其hashCode()方法。
3)一个哈希表有三列,第一列是hash码,第二列是key,第三列是value,往哈希表中存进一个元素(即调用add()方法),会调用
key的hashCode()方法算出哈希值,根据哈希值得出该key在哈希表中的索引,接着就会遍历该索引中的所有的元素,调用key的equals()
方法,如果equals()方法返回true,则会覆盖哈希表中的元素,返回覆盖之前的值,否则就返回null。
2、HashSet的特点: