Java高级之HashMap中的entrySet()方法使用
作者:二木成林
基本使用
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>的实现类。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。