HashMap的几种遍历方式分析

简要介绍HashMap

相信大家学过数据结构的对哈希表(Hash table)并不陌生,即使不熟悉你也应该听过哈希冲突等词,哈希表也称散列表,是一种非常重要的数据结构,出现于各种应用场景,许多缓存技术的核心就是内存中维护一张非常大的哈希表。
HashMap基于哈希表Map接口实现,提供了所有可选的映射操作,其相对于数组、线性链表、二叉树等数据结构在进行添加、删除查找等操作的性能非常高,时间复杂度为O(1)(不考虑哈希冲突的情况)。
HashMap的主要操作是put和get,内部的Entry数组是基本组成单元,每一个Entry包含一个Key-value键值对,可以说它是由数组+链表组成的。
HashMap的几种遍历方式包括使用迭代器方式遍历、For Each方式遍历,Lambda表达式遍历以及Stream API遍历(后面两种应该是JDK 1.8+以后才有的)在这里主要介绍前面三种方式遍历。
使用迭代器和For Each遍历又可以细分为分别使用EntrySet和KeySet的方式遍历。
entrySet()
在这里插入图片描述
entrySet如文档描述,是返回此映射中包含的映射的Set视图。
keySet()
在这里插入图片描述
keySet()方法返回此映射中包含的键的Set视图。
两者区别也一目了然,一个返回键值对,而一个只会返回键。

迭代器遍历HashMap

1.迭代器EntrySet()

/*
            1.使用EntrySet()方法的迭代器
        */
        HashMap<Integer,String> map1=new HashMap<>();
        map1.put(1,"大王");
        map1.put(2,"小王");
        map1.put(3,"♠2");
        map1.put(4,"♠A");
        map1.put(5,"♠K");
        Iterator<Map.Entry<Integer,String>> it = map1.entrySet().iterator();
        while(it.hasNext()) {
            Map.Entry<Integer, String> entry = it.next();
            System.out.println(entry.getKey() + entry.getValue());
        }
        //System.out.println(map1);

输出结果(最后一行为直接打印HashMap的结果)
在这里插入图片描述
2.迭代器KeySet()

        /*
            2.使用KeySet()方法的迭代器
         */
        HashMap<Integer,String> map2=new HashMap<>();
        map2.putAll(map1);
        Iterator<Integer> it = map2.keySet().iterator();
        while(it.hasNext()) {
            Integer key = it.next();
            System.out.println(key+ map2.get(key));
        }

输出结果
在这里插入图片描述

ForEach遍历HashMap

1.ForEach EntrySet()

/*
            3.使用EntrySet()的foreach方法
         */
        HashMap<Integer,String> map3=new HashMap<>();
        map3.putAll(map2);
        for (Map.Entry<Integer, String> entry : map1.entrySet()) {
            System.out.println(entry.getKey() + entry.getValue());
        }

2.ForEach KeySet()

/*
            4.使用keySet()的foreach方法
         */
        HashMap<Integer,String> map4=new HashMap<>();
        map4.putAll(map3);
        for(Integer key: map1.keySet()){
            System.out.println(key+map4.get(key));
        }

Lambada遍历HashMap

/*
            5.使用Lambada表达式
         */
        HashMap<Integer,String> map5=new HashMap<>();
        map5.putAll(map4);
        map5.forEach((key,value)->{
            System.out.println(key+value);
        });

以上五种方法的输出结果都是一样的,但是相信大家看过代码之后会有一定的理解了,使用Lambada表达式能有效地改观代码,但其核心仍然是使用foreach的遍历,并且在使用迭代器调用entrySet()方式IDEA直接建议改成entrySet()的foreach遍历方法,仅从遍历方式来说,foreach方法似乎会更加合理,同时比较entrySet和keySet方法可以发现,二者因为存储不同而在取值方法上也有些不同,entrySet可以直接通过getKey()和getValue()获取内容,keySet因为存储的是键,需要通过对应映射关系去寻找值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值