我们在平时的业务处理中,List、Map两个集合的使用率应该是最高的。对于List的遍历非常非常的简单,但是对于Map的遍历就有很多情况。由于昨天自己在读取redis中数据的时候,发现取出来的hash类型的数据的值是一个Map集合,提交代码以后发现代码写的过于冗余,于是便进行了修改,也顺便记录一下对于Map.Entry方法的使用。

Map是java中的接口,Map.Entry是Map的一个内部接口。

Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。

Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

我们每次遍历Map集合中的数据的时候,往往更多的时候会使用如下代码,也就是每次从Map中取出来key,然后根据key通过get(key)的方法去获取每一个键的值:

@Test
    public void test02(){
        Map<Integer,String> map = new HashMap<>();
        map.put(1, "莫德里奇");
        map.put(2, "罗纳尔多");
        map.put(3, "马拉多纳");
        map.put(4, "克鲁伊维特");
        Set keys = map.keySet( );
        if(keys != null) {
            Iterator iterator = keys.iterator();
            while (iterator.hasNext()) {
                Object key = iterator.next();
                Object value = map.get(key);
                System.out.println(key + "---" + value);
            }
        }
    }

程序的输出结果是显而易见的:

1---莫德里奇
2---罗纳尔多
3---马拉多纳
4---克鲁伊维特

这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。当数据量上来了以后,此方法会成指数倍的增加时间。如果我们在遍历集合的方法内部还需要遍历集合时,那么此种方法将变得非常的笨重。

不过Java给我们提供了一个更加简单的途径。Map类提供了一个名为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。

@Test
    public void test02(){
        Map<Integer,String> map = new HashMap<>();
        map.put(1, "莫德里奇");
        map.put(2, "罗纳尔多");
        map.put(3, "马拉多纳");
        map.put(4, "克鲁伊维特");
        Set<Map.Entry<Integer,String>> entrySet = map.entrySet();
        for (Map.Entry<Integer, String> entry : entrySet) {
            System.out.println(entry.getKey() + "==>" + entry.getValue());
        }
    }

类比于第一个方法来看,此方法的简便性要高于第一种遍历,而且第二种方式我们拿到的就是Map集合中的一个entry,也就是一对键值对,我们只需要选择我们需要的是key还是value,可以通过getKey()和getValue()方法来获取它们,避免了我们每次都通过key去拿value的过程。
另外,Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。

在此也说一个关于Map的另外一个只获取key的方法。Map提供了一个keySet()方法,此方法返回为一个Set集合,泛型为Map的key的数据类型。

@Test
    public void test02(){
        Map<Integer,String> map = new HashMap<>();
        map.put(1, "a");
        map.put(2, "b");
        map.put(3, "c");
        map.put(4, "d");
        Set<Integer> integers = map.keySet();
        for (Integer integer : integers) {
            System.out.println(integer);
        }
    }

程序的输出如下:

1
2
3
4

好了,今天就先写到这了。自己本身是一个每天奔波于公司和家的小菜鸟,不为了能取得多大的成功,只希望为了心中的梦想而努力奋斗。努力不一定成功,最坏的结果也只是大器晚成。加油!!