基本使用
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());
}
}
}
原理剖析
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()方法的源码注释如下:
public Set<Map.Entry<K, V>> entrySet() {
Set<Map.Entry<K, V>> es;
return (es = entrySet) == null ? (entrySet = new EntrySet()) : 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>的实现类。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。