Java笔记-HashMap遍历

 对HashMap的遍历选择,本质上是keySet与entrySet的选择。在JDK1.8源码中,HashMap包含了两种Iterator:EntryIterator与KeyIterator。

EntryIterator:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
final class EntryIterator
extends HashMap<K, V>.HashIterator
implements Iterator<Map.Entry<K, V>>
{
EntryIterator()
{
super();
}

public final Map.Entry<K, V> next()
{
return nextNode();
}
}

KeyIterator:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
final class KeyIterator
extends HashMap<K, V>.HashIterator
implements Iterator<K>
{
KeyIterator()
{
super();
}

public final K next()
{
return (K)nextNodekey;
}
}

 两种迭代器都继承于HashMap内部实现的一个抽象迭代器:HashIterator。具体细节可以自行查看JDK源码。

 所以相应的,对于HashMap的遍历问题也就是选择KeyIterator还是EntryIterator。两者的区别显而易见,因此使用场景也较为分明。大多数情况下,我们都是对EntrySet进行遍历,无论是使用Iterator还是foreach进行遍历。因为访问键值对的时候,keySet是根据key再匹配value,而entry则已经把key-value都记录了。

 当然,在只需要遍历key的场景下,keySet遍历会节省资源。

 其实HashMap源码还有很多可以探讨的东西,有机会做个整理。