JAVA集合类(5):HashMap与HashSet源码深度剖析

查看 HashSet的源码会发现,HashSet是由HashMap生成。

public HashSet() {
	map = new HashMap<E,Object>();
    }

 当使用HashSet的add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上)。如下为源码。

private static final Object PRESENT = new Object();
public boolean add(E o) {
	return map.put(o, PRESENT)==null;
 }

 HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储在该数组中;

在向HashMap中put一对键值时,它会根据key的hashcode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。如果该位置没有对象存在,就将此对象直接放进数组中,如果该位置已经有对象存在了。则顺着此存在的对象链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一对象),如果此链上有对象,再去用equals方法进行比较,如果此链上的某个对象的equals方法比较为false,则将该对象放到数组中,然后将数组中该位置以前存在的那个对象链接到此对象后面,使用Entry对象的next变量来链。之所以要将新值放到数组中,则旧值放在链接中,是因为新值更有可能被访问。

JAVA集合类(5):HashMap与HashSet源码深度剖析

 

你可能感兴趣的:(HashMap)