基本使用
entrySet()方法得到HashMap中各个键值对映射关系的集合。
然后Map.Entry中包含了getKey()和getValue()方法获取键和值。
示例:
public class Demo {public static void main(String[] args) {Map<String, String> map = new HashMap<>();map.put("abc", "123");map.put("efg", "456");// 使用增强型for遍历循环Map集合Set<Map.Entry<String, String>> entrySet = map.entrySet();for (Map.Entry<String, String> entry : entrySet) {System.out.println(entry.getKey() + "->" + entry.getValue());}}
}
/*** 打印结果:* abc->123* efg->456*/
原理剖析
HashMap的entrySet()方法返回Set<Map.Entry<String, String>>,那么为什么entrySet()方法可以得到键值对映射集合呢?
public Set<Map.Entry<K, V>> entrySet() {Set<Map.Entry<K, V>> es;return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;}
其实entrySet()方法的原理和keySet()方法、values()方法的原理是一致的。
entrySet()方法的源码注释如下:
/*** 该方法返回值就是这个map中各个键值对映射关系的集合* 1.Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value* 2.Map.Entry里面包含getKey()和getValue()方法** @return 返回map中各个键值对映射关系的集合*/public Set<Map.Entry<K, V>> entrySet() {Set<Map.Entry<K, V>> es;return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;/*等价于(代码复杂化)Set<Map.Entry<K, V>> es = entrySet;if (es == null) {entrySet = new EntrySet();return entrySet;} else {return es;}*/}
那么看看编译后生成的字节码文件Demo.class
public class Demo {public Demo() {}public static void main(String[] args) {Map<String, String> map = new HashMap();map.put("abc", "123");map.put("efg", "456");Set<Entry<String, String>> entrySet = map.entrySet();Iterator var3 = entrySet.iterator();while(var3.hasNext()) {Entry<String, String> entry = (Entry)var3.next();System.out.println((String)entry.getKey() + "->" + (String)entry.getValue());}}
}
能够获取到元素是通过迭代器Iterator遍历得来的,所以entrySet()方法能有键值对的映射集合,是因为iterator()方法。
那么iterator()方法是哪里的呢?在entrySet()方法中使用new实例化了一个EntrySet类

查看EntrySet类源码,里面有个iterator()方法,字节码文件中调用的就是该iterator()方法

在该方法的return语句中又实例化了EntryIterator类作为返回值,是一个迭代器,查看EntryIterator类的源码,只有一个next()方法

该方法被调用返回的类型就是Map.Entry<K, V>,而得到的结果是nextNode()方法的返回值。

nextNode()方法的作用就是返回下一个结点。
而Entry是Map的内部接口,该Entry接口有几个方法可以设置或得到键值。

所以能够通过entry.getKey()和entry.getValue()方法获取到键和值。
并且Node<K, V>是Map.Entry<K, V>的实现类。

参考链接:
- Java高级之HashMap中的keySet()方法
- Java高级之HashMap中的values()方法











