Java中Map的 entrySet() 详解以及用法(四种遍历map的方式)
Entry
由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。
Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)
Map.Entry里面包含getKey()和getValue()方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Iterator<Map.Entry<Integer, Integer>> it=map.entrySet().iterator(); 2 while(it.hasNext()) { 3 Map.Entry<Integer,Integer> entry=it.next(); 4 int key=entry.getKey(); 5 int value=entry.getValue(); 6 System.out.println(key+" "+value); 7 }
entrySet
entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。
entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。
用来遍历map的一种方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Set<Map.Entry<String, String>> entryseSet=map.entrySet(); for (Map.Entry<String, String> entry:entryseSet) { System.out.println(entry.getKey()+","+entry.getValue()); }
keySet
还有一种是keySet, keySet是键的集合,Set里面的类型即key的类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
还有一种是keySet, keySet是键的集合,Set里面的类型即key的类型 Set<String> set = map.keySet(); for (String s:set) { System.out.println(s+","+map.get(s)); }
四种map变量方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static void main(String[] args) { 2 3 Map<String, String> map = new HashMap<String, String>(); 4 map.put("1", "value1"); 5 map.put("2", "value2"); 6 map.put("3", "value3"); 7 8 //第一种:普遍使用,二次取值 9 System.out.println("通过Map.keySet遍历key和value:"); 10 for (String key : map.keySet()) { 11 System.out.println("key= "+ key + " and value= " + map.get(key)); 12 } 13 14 //第二种 15 System.out.println("通过Map.entrySet使用iterator遍历key和value:"); 16 Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); 17 while (it.hasNext()) { 18 Map.Entry<String, String> entry = it.next(); 19 System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); 20 } 21 22 //第三种:推荐,尤其是容量大时 23 System.out.println("通过Map.entrySet遍历key和value"); 24 for (Map.Entry<String, String> entry : map.entrySet()) { 25 System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); 26 } 27 28 //第四种 29 System.out.println("通过Map.values()遍历所有的value,但不能遍历key"); 30 for (String v : map.values()) { 31 System.out.println("value= " + v); 32 }
关于Java中的Map遍历方式比较
最近在看阿里巴巴最新版的Java开发手册,里面的内容还是很值得去阅读学习,下面是我对Java中Map的遍历方式的比较和总结:
第一种:使用entrySet()
的形式来遍历,也是效率高,推荐使用的一种遍历map的方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Map<String, String> map = new HashMap<>(); 2 map.put("x", "aaa"); 3 map.put("y", "bbb"); 4 for (Map.Entry<String,String> entry:map.entrySet()){ 5 System.out.println(entry.getKey()+ "---" + entry.getValue()); 6 }
打开entrySet()
的源码可以看到:
Set<Map.Entry<K, V>> entrySet();
该方法返回的是一个Set集合,集合中的类型是一个Map.Entry<K,V>类型,其中Entry<K,V>对象中保存的就是map中的键值对映射,所以,调用entrySet()方法,是直接返回一个K-V键值对,所以我们就可以直接对Map.Entry<K,V>对象调用getKey()和getValue()方法来获取map中的键和对应的值。其中Entry是一个interface,属于Map接口中的,而且Entry接口有getValue(),getKey(),remove(),setValue()等方法。
优点:直接返回一个k-v对象。
第二种:使用keySet()
方法进行遍历,代码实现如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Map<String, String> map = new HashMap<>(); 2 map.put("x", "aaa"); 3 map.put("y", "bbb"); 4 Iterator<String> iteratorMap = map.keySet().iterator(); 5 while (iteratorMap.hasNext()){ 6 System.out.println(iteratorMap.next() + "====" + map.get(iteratorMap.next())); 7 }
keySet
其实是遍历了2次,一次是转为Iterator
对象,另一次是从hashMap
中取出key
所对应的value
第三种:使用JDK 8中的Map.foreach()
操作:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Map<String, String> map = new HashMap<>(); 2 map.put("x", "aaa"); 3 map.put("y", "bbb"); 4 map.forEach((k,v)-> System.out.println(k + "---" +v));
在JDK 1.8中Map
接口中增加了默认的实现,点击map.foreach()
可以看到如下源码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 default void forEach(BiConsumer<? super K, ? super V> action) { 2 Objects.requireNonNull(action); 3 for (Map.Entry<K, V> entry : entrySet()) { 4 K k; 5 V v; 6 try { 7 k = entry.getKey(); 8 v = entry.getValue(); 9 } catch(IllegalStateException ise) { 10 // this usually means the entry is no longer in the map. 11 throw new ConcurrentModificationException(ise); 12 } 13 action.accept(k, v); 14 } 15 }
JAVA 8的新特性就是增加了函数式编程,里面的实现还是利用entrySet()
来实现map集合的遍历。