对HashMap的遍历选择,本质上是keySet与entrySet的选择。在JDK1.8源码中,HashMap包含了两种Iterator:EntryIterator与KeyIterator。
EntryIterator:
1 | final class EntryIterator |
KeyIterator:
1 | final class KeyIterator |
两种迭代器都继承于HashMap内部实现的一个抽象迭代器:HashIterator。具体细节可以自行查看JDK源码。
所以相应的,对于HashMap的遍历问题也就是选择KeyIterator还是EntryIterator。两者的区别显而易见,因此使用场景也较为分明。大多数情况下,我们都是对EntrySet进行遍历,无论是使用Iterator还是foreach进行遍历。因为访问键值对的时候,keySet是根据key再匹配value,而entry则已经把key-value都记录了。
当然,在只需要遍历key的场景下,keySet遍历会节省资源。
其实HashMap源码还有很多可以探讨的东西,有机会做个整理。