• Map集合的entrySet()方法


    之前学习集合的时候要通过迭代器来迭代的时候最难得就是map集合得迭代,一直也不太明白,今天总算搞懂了

    首先我们看什么容器才能迭代

    根据API我们得知是对所有collection迭代的集合,那么已知的collection容器有哪些

    我把常用的标出了,我们接着看这些能容器如何迭代我们点进去,发现了collection容器有两种情况

    第一:

    拥有一个返回类型为Iterator的方法,我们通过这个方法得到迭代器

    第二:

    实现了Iterable接口,看看你这个接口

    那么我们也可以调用这个方法拿到迭代容器迭代器。

    但是我们发现collection接口的子接口没有Map接口,那么我们无法通过Map来直接获取迭代器。

    接下来就是我们的重点了:

    实现方法:

    我们发现在Map集合中有这么一个方法:

    我们先不要管Map.Entry,看起来它就是一个泛型,对我们影响不大。

    集体看下这个方法的描述:

    返回此映射中包含的映射关系的 [这里是代码001] 视图。该 set 受映射支持,所以对映射的更改可在此 set 中反映出来,反之亦然。如果对该 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作,或者通过对迭代器返回的映射项执行 setValue 操作除外),则迭代结果是不确定的。set 支持元素移除,通过 Iterator.remove、 Set.remove、 removeAll、 retainAll 和 clear 操作可从映射中移除相应的映射关系。它不支持 add 或 addAll 操作。

    返回:

    此映射中包含的映射关系的 set 视图

    我们发现返回一个set集合,并且这个set可以对映射支持,就是你在map集合的改动,在这个set集合中也可以反映出来

    那么就是说这个方法把我们的map的每个键值对都当作一个对象存入了set集合中。那么我们就可以用set集合来迭代这个map的所有值。

    我们发现这个方法返回类型的泛型是Map.Entry,我们看下是什么。

    看下Entry的接口说明

    接口 Map.Entry
    所有已知实现类: 
    AbstractMap.SimpleEntry, AbstractMap.SimpleImmutableEntry 
    正在封闭接口:
    Map 
    
    
    public static interface Map.Entry映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象仅 在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    用了entry

    Map map=new HashMap();//这样没有问题
    		map.put(1, 1);
            Set set = map.entrySet();	
           Iterator it=set.iterator();
            while(it.hasNext()) {
            	Entry map1=it.next();
            	System.out.println(map1);
            }
            for(Entry en:set)
            {
            	System.out.println(en);
            	System.out.println(en.getKey());
            	System.out.println(en.getValue());
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    没用entry

    	public static void main(String[] args) throws CloneNotSupportedException {
    		Map map=new HashMap();
    		map.put(1, 1);
            Set set = map.entrySet();	
           Iterator it=set.iterator();
            while(it.hasNext()) {
            	Object map1=it.next();
            	System.out.println(map1);
            }
            for(Object en:set)
            {
            	System.out.println(en);
            
            } 
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这两种方法都可以,只是第一种规定了Entry泛型,这个泛型对象相当于包装了键值对的对象,用这个对象可以使用里面的getKey和getValue方法,所以我们使用这个泛型对map操作

    也就是说entrySet返回一个保存键值对的set集合,如果设置这个set对象接受的对象类型是Entry类型,那么可以使用Entry接口里的getKey和getValue方法。也就是Entry接口实例化的类的对象可以用来更好的操作map类型

  • 相关阅读:
    【算法leetcode】2325. 解密消息(rust和go重拳出击)
    iOS 组件化之使用 Cocoapods 创建本地 Pod
    Kotlin注解
    【leetcode】分割等和子集
    Linux- 命名信号量和无名信号量的区别
    P1523 旅行商简化版, 路径dp
    AWS无服务器 应用程序开发—第九章 权限(Amazon IAM)
    etcd使用与原理【22Fa】
    1.了解网页的构成
    Linux内核分析(十五)--内存管理之虚拟地址与mmap原理
  • 原文地址:https://blog.csdn.net/m0_67403240/article/details/126435055