本文已包含在“访谈的选择”系列中,Gitee开源地址:https://gitee.com/mydb/interview
有很多方法可以穿越哈希图。不同的JDK版本有不同的写作方式。其中,JDK 8提供了3种哈希图遍历方法,并打破了先前遍历方法的“非常肿”方法的尴尬。
在JDK 8之前,使用了输入集和密钥集进行遍历,并且特定的实现代码如下。
入口集是早期哈希图遍历的主要方法。实际上,当前代码如下:
如下图所示,上述程序的执行结果:
密钥集的遍历是循环键内容,然后通过map.get(key)获得值的值。具体实现如下:
如下图所示,上述程序的执行结果:
通过上述代码,我们可以看到上述代码遍历性能。它的性能不如入口集,因为Keyset实际上循环两次。)等同于聚会集,因此无法使用Keyst循环,因为该周期已经循环两次,因此效率相对较低。
除了上述直接循环外,入口集和密钥集还可以使用其迭代装置进行循环。
如下图所示,上述程序的执行结果:
Keyset也可以由迭代器进行遍历,并且代码如下:
如下图所示,上述程序的执行结果:尽管不建议使用Keyset循环,但有必要理解它。
既然您可以直接穿越它,为什么仍需要使用它?我们通过以下示例知道。
如果未使用迭代器删除它,则如果未使用迭代器,则遍历输入集,请删除遍历代码中的元素,则代码的实现如下:
如下图所示,上述程序的执行结果:可以看出,如果元素在遍历代码中动态删除,则非列表方法将报告错误。
使用迭代删除删除下一个。我们使用迭代器来循环输入集,并在周期中动态删除元素以达到代码,如下所示:
如下图所示,上述程序的执行结果可以从上面的结果中可以看出,使用迭代器的优点是,该集合中的集合中的元素可以在周期中动态删除。非列表的方法在周期期间无法删除元素(程序将报告错误)。
在JDK 8之后,哈希玛普的遍历变得更加方便。JDK 8包含以下3种遍历方法:
我们分开看它。
带有lambda表达式遍历的代码如下:如下:
如下图所示,上述程序的执行结果:
流遍历是首先获取地图集合的入口集,然后执行foreach循环以实现代码如下:
如下图所示,上述程序的执行结果:
流多线程的遍历方法类似于先前的遍历方法,但仅执行并行复杂的方法。此方法将根据当前的硬件配置生成相应的线程号,然后将执行遍历操作以实现代码如下:
上面程序的执行结果,如下图所示:请注意,可以看到上图的执行结果可以看出,当前的执行结果与所有先前的遍历结果不同(打印元素的顺序不同),由于程序是同时执行的,因此Sothere无法确保元素的执行顺序和打印顺序。这是并发编程的特征。
建议使用不同的方案使用不同的遍历方法。例如,如果它是JDK 8之后的开发环境,则建议使用流遍历,因为它足够简单。而且,如果您需要在遍历过程中动态删除元素,则建议使用迭代器的遍历方法;如果您更关心遍历程序的执行效率,则建议使用流多线程遍历,因为它已经足够快。因此,该问题的答案尚未解决。我们需要了解每种遍历方法的优势和缺点,然后根据不同的场景灵活地更改。
本文介绍了7个hashmap的遍历方法。其中,JDK 8主要使用入口集和按键进行遍历,而Keyset的遍历方法相对较低,通常不建议使用。但是,在JDK 8的遍历之后,有一些新的选择。或者,您可以使用高性能流多线程遍历。
正确和非审判,破坏其声誉并迷失。
博客简介:帖子-80年代的程序员已经“持续”了11年,爱好:阅读,慢跑,羽毛球。
公共帐户:Java面试实际问题分析