HashMap的遍历

关于HashMap的遍历

近几日面试让手写HashMap的遍历,虽然依稀记得,奈何模糊了。
原文地址
共七种遍历方式:

  1. 使用迭代器(Iterator)EntrySet 的方式进行遍历;
  2. 使用迭代器(Iterator)KeySet 的方式进行遍历;
  3. 使用 For Each EntrySet 的方式进行遍历;
  4. 使用 For Each KeySet 的方式进行遍历;
  5. 使用 Lambda 表达式的方式进行遍历;
  6. 使用 Streams API 单线程的方式进行遍历;
  7. 使用 Streams API 多线程的方式进行遍历。

第一种、使用ForEach EntrySet的方式

	/**
     * 使用Foreach EntrySet
     */
    public void Test1(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        for (Map.Entry<Integer,Integer> entry:map.entrySet()) {
            System.out.println("Key=>"+entry.getKey());
            System.out.println("Value=>"+entry.getValue());
        }
    }

第二种、使用迭代器EntrySet

	/**
     * 使用迭代器EntrySet
     */
    public void Test3(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        Iterator<Map.Entry<Integer,Integer>> entries = map.entrySet().iterator();
        while (entries.hasNext()){
            Map.Entry<Integer,Integer> entry = entries.next();
            System.out.println("Key=>"+entry.getKey());
            System.out.println("Value=>"+entry.getValue());
        }
    }

第三种、使用迭代器KeySet的方式

	/**
     * 迭代键值对的方式
     */
    public void Test2(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        Iterator<Integer> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            Integer key = iterator.next();
            Integer value = map.get(key);
            System.out.println("Key=>"+key);
            System.out.println("Value=>"+value);
        }
    }

第四种、使用ForEach KeySet的方式

	/**
     * 使用ForEach KeySet
     */
    public void Test4(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        for (Integer key:map.keySet()) {
            System.out.println("Key=>"+key);
            System.out.println("Value=>"+map.get(key));
        }
    }

第五种、使用Lambda表达式的方式

	/**
     * 使用Lambda表达式
     */
    public void Test5(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        map.forEach((key,value) ->{
            System.out.println("key=>"+key);
            System.out.println("value=>"+value);
        });
    }

第六种、使用Streams API单线程的方式

 /**
     * Stream API单线程
     */
    public void Test6(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        map.entrySet().parallelStream().forEach((entry) -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        });
    }

第七种、使用Streams API多线程的方式

/**
     * Streams API多线程
     */
    public void Test7(){
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,1111);
        map.put(2,2222);
        map.entrySet().parallelStream().forEach((entry) -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        });
    }

总结:

EntrySet 之所以比 KeySet 的性能高是因为,KeySet 在循环时使用了 map.get(key),而 map.get(key) 相当于又遍历了一遍 Map 集合去查询 key 所对应的值。为什么要用“又”这个词?那是因为在使用迭代器或者 for 循环时,其实已经遍历了一遍 Map 集合了,因此再使用 map.get(key) 查询时,相当于遍历了两遍。
而 EntrySet 只遍历了一遍 Map 集合,之后通过代码“Entry<Integer, String> entry = iterator.next()”把对象的 key 和 value 值都放入到了 Entry 对象中,因此再获取 key 和 value 值时就无需再遍历 Map 集合,只需要从 Entry 对象中取值就可以了。
所以,EntrySet 的性能比 KeySet 的性能高出了一倍,因为 KeySet 相当于循环了两遍 Map 集合,而 EntrySet 只循环了一遍。

我们不能在遍历中使用集合 map.remove() 来删除数据,这是非安全的操作方式,但我们可以使用迭代器的 iterator.remove() 的方法来删除数据,这是安全的删除集合的方式。同样的我们也可以使用 Lambda 中的 removeIf 来提前删除数据,或者是使用 Stream 中的 filter 过滤掉要删除的数据进行循环,这样都是安全的,当然我们也可以在 for 循环前删除数据在遍历也是线程安全的。

如果从性能方面考虑,我们应该尽量使用 lambda 或者是 entrySet 来遍历 Map 集合。尽量使用 entrySet 来遍历 HashMap,这样既安全又高效。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于HashMap遍历,有几种常用的方法可以实现: 1. 使用EntrySet遍历:通过调用HashMap的entrySet()方法获取到HashMap中所有的键值对组成的Set集合,然后通过遍历Set集合中的每个元素,来获取键和值。 ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用entrySet遍历 for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println("Key: " + key + ", Value: " + value); } ``` 2. 使用KeySet遍历:通过调用HashMap的keySet()方法获取到HashMap中所有的键组成的Set集合,然后通过遍历Set集合中的每个键,来获取对应的值。 ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用keySet遍历 for (String key : map.keySet()) { Integer value = map.get(key); System.out.println("Key: " + key + ", Value: " + value); } ``` 3. 使用Java 8的forEach方法遍历:利用HashMap的forEach方法,可以使用Lambda表达式对每个键值对进行操作。 ```java HashMap<String, Integer> map = new HashMap<>(); // 添加键值对 map.put("A", 1); map.put("B", 2); map.put("C", 3); // 使用forEach遍历 map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value)); ``` 以上是几种常用的HashMap遍历方法,根据具体的需求选择适合的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值