java中的HashMap类的遍历

示例代码如下:
 1 public class HashMapBianLiTest {
 2     public static void main(String[] args) {
 3         // hashMap的遍历
 4         HashMap hashMap = new HashMap();
 5         hashMap.put("张晋","蔡少芬");
 6         hashMap.put("王宝强","马蓉");
 7         hashMap.put("宋儿","马蓉");
 8         hashMap.put("宋儿","元明"); // 覆盖【替换】
 9 
10         // 第一种方式:KeySet
11         // 静态内部类:class java.util.HashMap$KeySet
12         Set keySet = hashMap.keySet();
13         // 1.1
14         Iterator iterator = keySet.iterator();
15         while (iterator.hasNext()) {
16             Object obj =  iterator.next();
17             System.out.println(obj + ": " + hashMap.get(obj));
18         }
19         // 1.2
20         for (Object o : keySet) {
21             System.out.println(o + ": " + hashMap.get(o));
22         }
23 
24         // 第二种方式:values【只能遍历value】
25         // 静态内部类:class java.util.HashMap$Values
26         Collection values = hashMap.values();
27         // 2.1
28         Iterator iterator1 = values.iterator();
29         while (iterator1.hasNext()) {
30             Object next =  iterator1.next();
31             System.out.println(next);
32         }
33         // 2.2
34         for (Object value : values) {
35             System.out.println(value);
36         }
37 
38         // 第三种方式:entrySet
39         // 静态内部类:class java.util.HashMap$EntrySet
40         // hashMap中的k-v,先转成一个Node类型【HashMap的静态成员内部类】的节点,将数个节点,放到EntrySet集合中。
41         // Node类型:static class Node<K,V> implements Map.Entry<K,V>【作用域在同一包下】
42         Set set = hashMap.entrySet();
43         // 3.1
44         Iterator iterator2 = set.iterator();
45         while (iterator2.hasNext()) {
46             // obj: class java.util.HashMap$Node
47             // 向下转型,调用Map.Entry<k,v>的方法
48             Object obj =  iterator2.next();
49             // 由于HashMap的静态成员内部类中的Node作用域是在同一包下,因此无法使用HashMap.Node,
50             // 但是Node implements Map.Entry<K,V>,因此可以用Map.Entry接口来转型,
51             // 通过动态绑定机制,调用Node类对象的已经实现的方法。
52             Map.Entry map = (Map.Entry) obj;
53             System.out.println(map.getKey() +": " + map.getValue());
54 
55 //            System.out.println(next);// Node重写了toString()
56         }
57         // 3.2
58         for (Object o : set) {
59             System.out.println(o);
60         }
61 
62     }
63 }

如果想要有更加深入的理解,请debug查看源码。

posted @ 2023-01-01 21:57  zwGitOne  阅读(60)  评论(0编辑  收藏  举报