HashMap源码阅读与解析(4)

比较待删除节点的key值和当前节点的key值是否相符。如果找不到相符的节点,返回null;
如果有相符的节点,且为头结点,e节点的下一个节点将被赋值给table[i];
如果有相匹配的节点,并且不为头结点,则prev节点不再指向e,而是指向e.next,也即是prev.next = e.next;相当于一个断链操作;

七、HashMap遍历

如果让你写一个hashmap的遍历代码,估计大部分人写出下面这段代码。可是HashMap的遍历过程到底是怎么样的,为什么我们每次取值的时候都使用iter.next()来取值的呢?下面我们就来看看HashMap的遍历实现。

Itreator iter = map.entrySet().itreator(); while(iter.hashNext()){ Map.entry<k,v> entry = (Map.entry<k,v>) iter.next(); }

HashMap类中有一个私有类EntrySet,它继承自AbstractSet类。EntrySet类中有一个iterator()方法,也就是我们上面在遍历hashMap所调用的iterator()方法,它会返回一个Iterator对象。
我们来看看iterator方法:

public Iterator<Map.Entry<K,V>> iterator() { return newEntryIterator(); }

iterator()方法中调用了newEntryIterator()方法,接着进入newEntryIterator()方法看看。

Iterator<Map.Entry<K,V>> newEntryIterator() { return new EntryIterator(); }

newEntryIterator方法又创建了一个EntryIterator对象并返回。这个EntryIterator很关键,我们来具体看看这个类。

private final class EntryIterator extends HashIterator<Map.Entry<K,V>> { public Map.Entry<K,V> next() { return nextEntry(); } }

EntryIterator类继承自HashItertor类,而且HashIterator类只有一个方法next()。既然EntryIterator继承自HashIterator类,那么EntryIterator到底继承了父类的哪些对象,默认实现了父类的哪些方法呢?我们再看看HashIterator类。

private abstract class HashIterator<E> implements Iterator<E> { Entry<K,V> next; // next entry to return int expectedModCount; // For fast-fail int index; // current slot Entry<K,V> current; // current entry HashIterator() { expectedModCount = modCount; if (size > 0) { // advance to first entry Entry[] t = table; while (index < t.length && (next = t[index++]) == null) ; } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f8ec0a8aae75abc6c4d1eda9203d2da7.html