从HashMap的遍历谈起

关于HashMap的遍历整理了以上7个主要方法。但每种遍历都有不同的地方。

  • 迭代器遍历EntrySet
  • 迭代器遍历KeySet
  • 增强for循环遍历EntrySet
  • 增强for循环遍历KeySet
  • map.foreach(…)
  • map.stream().foreach(…)
  • map.parallelStream.foreach(…)

速度上看
并发环境下jdk 8 的并行流速度是最快的。因为它将任务细分给多个cpu同时做,但是在数据量小的时候可能会比普通的方式慢些(细分任务耗时大于多任务做)。
迭代器的方法和增强for反编译后都是使用的迭代器。
其他几个速度都差不多,很多博客说的遍历EntrySet比遍历KeySet快些,原因是因为KeySet在拿到key之后多一步map.get(key)。自己实测是对速度没多大影响。优雅点罢了,想要优雅用```stream``何乐而不为呢? ps:调试的时候可要抓破头了(滑稽

remove安全性看
迭代器遍历可以使用iterator.remove(…)的方法是安全的。 具体看之前的文章。
增强for的话只能使用集合自带的remove()方法,在fail-fast机制的容器下会抛出异常,在fail-safe容器下则没问题,ConcerrentHashMap和CopyOnWriteArrayList等。
lamda和stream直接删除均不安全。
lamda可以使用

map.keySet().removeIf(key -> key == 1);

stream可以在遍历前过滤。

map.entrySet().stream().filter(m -> 1 != m.getKey()).forEach((entry) -> {
    if (entry.getKey() == 1) {
        System.out.println("del:" + entry.getKey());
    } else {
        System.out.println("show:" + entry.getKey());
    }
});

总之使用HashMap.remove()不行,它存在fail-fast机制问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值