toshine

导航

Java中Map的 entrySet() 详解以及用法(四种遍历map的方式)

Entry
由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。
Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)
Map.Entry里面包含getKey()和getValue()方法

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     }
View Code

entrySet
entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。

entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。
用来遍历map的一种方法。

Set<Map.Entry<String, String>> entryseSet=map.entrySet();
 
for (Map.Entry<String, String> entry:entryseSet) {
 
    System.out.println(entry.getKey()+","+entry.getValue());
 
}
View Code

keySet

还有一种是keySet, keySet是键的集合,Set里面的类型即key的类型

还有一种是keySet, keySet是键的集合,Set里面的类型即key的类型

Set<String> set = map.keySet();
 
for (String s:set) {
 
    System.out.println(s+","+map.get(s));
 
}
View Code

四种map变量方法:

 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     }
View Code

 

 

关于Java中的Map遍历方式比较

最近在看阿里巴巴最新版的Java开发手册,里面的内容还是很值得去阅读学习,下面是我对Java中Map的遍历方式的比较和总结:

第一种:使用entrySet()的形式来遍历,也是效率高,推荐使用的一种遍历map的方式:

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 }
View Code

打开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()方法进行遍历,代码实现如下:

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 }
View Code

keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value

第三种:使用JDK 8中的Map.foreach()操作:

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));
View Code

在JDK 1.8中Map接口中增加了默认的实现,点击map.foreach()可以看到如下源码:

 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     }
View Code

JAVA 8的新特性就是增加了函数式编程,里面的实现还是利用entrySet()来实现map集合的遍历。

posted on 2023-03-06 20:27  加瓦开阀攻城狮  阅读(51)  评论(0编辑  收藏  举报

……