精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:HashMap有幾種遍歷方法?推薦使用哪種?

開發 前端
HashMap 的遍歷方法有很多種,不同的 JDK 版本有不同的寫法,其中 JDK 8 就提供了 3 種 HashMap 的遍歷方法,并且一舉打破了之前遍歷方法“很臃腫”的尷尬。

[[439189]]

HashMap 的遍歷方法有很多種,不同的 JDK 版本有不同的寫法,其中 JDK 8 就提供了 3 種 HashMap 的遍歷方法,并且一舉打破了之前遍歷方法“很臃腫”的尷尬。

1.JDK 8 之前的遍歷

JDK 8 之前主要使用 EntrySet 和 KeySet 進行遍歷,具體實現代碼如下。

1.1 EntrySet 遍歷

EntrySet 是早期 HashMap 遍歷的主要方法,其實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     for (Map.Entry<String, String> entry : map.entrySet()) { 
  10.         System.out.println(entry.getKey() + ":" + entry.getValue()); 
  11.     } 

以上程序的執行結果,如下圖所示:

1.2 KeySet 遍歷

KeySet 的遍歷方式是循環 Key 內容,再通過 map.get(key) 獲取 Value 的值,具體實現如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     for (String key : map.keySet()) { 
  10.         System.out.println(key + ":" + map.get(key)); 
  11.     } 

以上程序的執行結果,如下圖所示:

KeySet 性能問題

通過以上代碼,我們可以看出使用 KeySet 遍歷,其性能是不如 EntrySet 的,因為 KeySet 其實循環了兩遍集合,第一遍循環是循環 Key,而獲取 Value 有需要使用 map.get(key),相當于有循環了一遍集合,所以 KeySet 循環不能建議使用,因為循環了兩次,效率比較低。

1.3 EntrySet 迭代器遍歷

EntrySet 和 KeySet 除了以上直接循環外,我們還可以使用它們的迭代器進行循環,如 EntrySet 的迭代器實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); 
  10.     while (iterator.hasNext()) { 
  11.         Map.Entry<String, String> entry = iterator.next(); 
  12.         System.out.println(entry.getKey() + ":" + entry.getValue()); 
  13.     } 

以上程序的執行結果,如下圖所示:

1.4 KeySet 迭代器遍歷

KeySet 也可以使用迭代器的方式進行遍歷,實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     Iterator<String> iterator = map.keySet().iterator(); 
  10.     while (iterator.hasNext()) { 
  11.         String key = iterator.next(); 
  12.         System.out.println(key + ":" + map.get(key)); 
  13.     } 

以上程序的執行結果,如下圖所示:圖片雖然 KeySet 循環方式不推薦使用,但還是有必要了解一下的。

1.5 迭代器的作用

既然能直接遍歷,那為什么還要用迭代器呢?通過以下例子我們就知道了。

不使用迭代器刪除

如果不使用迭代器,假如我們在遍歷 EntrySet 時,在遍歷代碼中刪除元素,代碼的實現如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     for (Map.Entry<String, String> entry : map.entrySet()) { 
  10.         if ("Java".equals(entry.getKey())) { 
  11.             // 刪除此項 
  12.             map.remove(entry.getKey()); 
  13.             continue
  14.         } 
  15.         System.out.println(entry.getKey() + ":" + entry.getValue()); 
  16.     } 

以上程序的執行結果,如下圖所示:

可以看到,如果在遍歷的代碼中動態刪除元素,非迭代器的方式就會報錯。

使用迭代器刪除

接下來,我們使用迭代器循環 EntrySet,并且在循環中動態刪除元素,實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); 
  10.     while (iterator.hasNext()) { 
  11.         Map.Entry<String, String> entry = iterator.next(); 
  12.         if ("Java".equals(entry.getKey())) { 
  13.             // 刪除此項 
  14.             iterator.remove(); 
  15.             continue
  16.         } 
  17.         System.out.println(entry.getKey() + ":" + entry.getValue()); 
  18.     } 

以上程序的執行結果,如下圖所示:圖片從上述結果可以看出,使用迭代器的優點是可以在循環的時候,動態的刪除集合中的元素。而上面非迭代器的方式則不能在循環的過程中刪除元素(程序會報錯)。

2.JDK 8 之后的遍歷

在 JDK 8 之后 HashMap 的遍歷就變得方便很多了,JDK 8 中包含了以下 3 種遍歷方法:

  • 使用 Lambda 遍歷
  • 使用 Stream 單線程遍歷
  • 使用 Stream 多線程遍歷

我們分別來看。

2.1 Lambda 遍歷

使用 Lambda 表達式的遍歷方法實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.      
  9.     // 循環遍歷 
  10.     map.forEach((key, value) -> { 
  11.         System.out.println(key + ":" + value); 
  12.     }); 

以上程序的執行結果,如下圖所示:

2.2 Stream 單線程遍歷

Stream 遍歷是先得到 map 集合的 EntrySet,然后再執行 forEach 循環,實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.      
  9.     // 循環遍歷 
  10.     map.entrySet().stream().forEach((entry) -> { 
  11.         System.out.println(entry.getKey() + ":" + entry.getValue()); 
  12.     }); 

以上程序的執行結果,如下圖所示:圖片

2.3 Stream 多線程遍歷

Stream 多線程的遍歷方式和上一種遍歷方式類似,只是多執行了一個 parallel 并發執行的方法,此方法會根據當前的硬件配置生成對應的線程數,然后再進行遍歷操作,實現代碼如下:

  1. public static void main(String[] args) { 
  2.     // 創建并賦值 hashmap 
  3.     HashMap<String, String> map = new HashMap() {{ 
  4.         put("Java"" Java Value."); 
  5.         put("MySQL"" MySQL Value."); 
  6.         put("Redis"" Redis Value."); 
  7.     }}; 
  8.     // 循環遍歷 
  9.     map.entrySet().stream().parallel().forEach((entry) -> { 
  10.         System.out.println(entry.getKey() + ":" + entry.getValue()); 
  11.     }); 

以上程序的執行結果,如下圖所示:

注意上述圖片的執行結果,可以看出當前執行結果和之前的所有遍歷結果都不一樣(打印元素的順序不一樣),因為程序是并發執行的,所以沒有辦法保證元素的執行順序和打印順序,這就是并發編程的特點。

推薦使用哪種遍歷方式?

不同的場景推薦使用的遍歷方式是不同的,例如,如果是 JDK 8 之后的開發環境,推薦使用 Stream 的遍歷方式,因為它足夠簡潔;而如果在遍歷的過程中需要動態的刪除元素,那么推薦使用迭代器的遍歷方式;如果在遍歷的時候,比較在意程序的執行效率,那么推薦使用 Stream 多線程遍歷的方式,因為它足夠快。所以這個問題的答案是不固定的,我們需要知道每種遍歷方法的優缺點,再根據不同的場景靈活變通。

總結

本文介紹了 7 種 HashMap 的遍歷方式,其中 JDK 8 之前主要使用 EntrySet 和 KeySet 的遍歷方式,而 KeySet 的遍歷方式性能比較低,一般不推薦使用。然而在 JDK 8 之后遍歷方式就有了新的選擇,可以使用比較簡潔的 Lambda 遍歷,也可以使用性能比較高的 Stream 多線程遍歷。

本文轉載自微信公眾號「Java面試真題解析」,可以通過以下二維碼關注。轉載本文請聯系Java面試真題解析公眾號。

 

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2022-03-07 07:33:16

線程池Java語言

2023-10-31 16:38:02

注冊中心負載均衡器

2023-02-20 08:08:48

限流算法計數器算法令牌桶算法

2025-09-26 07:58:58

2025-03-26 01:25:00

MySQL優化事務

2022-08-02 06:31:32

Java并發工具類

2024-03-07 17:21:12

HotSpotJVMHot Code

2022-07-26 08:40:42

Java并發工具類

2021-05-27 07:14:52

ZooKeeper節點類型

2020-12-03 07:39:50

HashMap底層數據

2020-06-19 15:32:56

HashMap面試代碼

2022-09-13 14:44:40

HashMap哈希表紅黑樹

2025-05-16 02:00:00

HashMapJava代碼

2021-07-14 08:00:13

reactCss模塊

2024-10-31 09:30:05

線程池工具Java

2020-05-13 14:35:47

HashMap面試官Java

2025-04-01 00:00:00

項目CRUD單例模式

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2024-02-26 14:07:18

2010-08-23 15:06:52

發問
點贊
收藏

51CTO技術棧公眾號

国产高清亚洲一区| 久久久久久久久国产一区| 色噜噜狠狠成人中文综合| 视频三区二区一区| www.黄色av| 亚洲欧美日韩国产| 日韩性xxxx爱| 欧美激情 亚洲| 成人黄页网站视频| 亚洲国产aⅴ天堂久久| 日本一区二区三区四区高清视频| 97人妻人人澡人人爽人人精品| 影音先锋久久精品| 视频在线观看99| 波多野结衣一二三区| 国产一区高清| 天天综合网 天天综合色| 一本色道久久综合亚洲精品婷婷 | 欧美一卡二卡在线观看| 五十路熟女丰满大屁股| 日本在线天堂| 2020国产精品| 国产高清精品一区二区| 在线观看日批视频| 亚洲在线观看| 九九热这里只有在线精品视| 亚洲第一视频区| 欧美在线导航| 精品国产乱子伦一区| 亚洲免费成人在线视频| 中文日产幕无线码一区二区| 亚洲综合色成人| 警花观音坐莲激情销魂小说| 国产精品四虎| 91亚洲精品一区二区乱码| 91精品美女在线| 亚洲欧美一区二区三区在线观看| 亚洲视频中文| 久久99久久久久久久噜噜| 黄色av片三级三级三级免费看| 亚欧洲精品视频在线观看| 精品美女一区二区| 久久艹这里只有精品| 成人午夜毛片| 在线精品视频免费观看| 欧美牲交a欧美牲交| 亚洲欧美成人影院| 亚洲免费在线观看| 中文字幕在线亚洲三区| 国产69久久| 中文字幕精品一区二区精品绿巨人| 久久精品国产99精品国产亚洲性色| 亚洲国产中文字幕在线| 国产传媒久久文化传媒| 亚洲综合av影视| 国产日韩欧美中文字幕| 精油按摩中文字幕久久| 国产欧美中文字幕| 91九色蝌蚪91por成人| 麻豆成人在线观看| 国产综合久久久久久| 97人妻精品一区二区三区视频 | 国产清纯白嫩初高中在线观看性色| 57pao成人永久免费| 欧美二区三区91| 在线a免费观看| 亚洲不卡在线| 亚洲第一中文字幕| 真人bbbbbbbbb毛片| 亚洲三级精品| 怡红院精品视频| 91视频青青草| 亚洲性图久久| 日本国产欧美一区二区三区| 黄色av一区二区| 久久精品国产一区二区| 96精品久久久久中文字幕| www.我爱av| 91在线观看免费视频| 午夜老司机精品| 麻豆视频网站在线观看| 亚洲国产一区在线观看| 日本日本19xxxⅹhd乱影响| 成人日韩在线| 日韩手机在线导航| 少妇光屁股影院| 水蜜桃久久夜色精品一区| 色综合久久悠悠| 国产精品视频一区在线观看| 美女视频免费一区| 亚洲一区中文字幕| av女名字大全列表| 国产精品狼人久久影院观看方式| 国产一级大片免费看| 美女露胸视频在线观看| 精品视频一区三区九区| 又黄又色的网站| 狠狠综合久久av一区二区蜜桃| 日韩中文字幕免费| 日韩男人的天堂| 久久成人免费日本黄色| 国产呦系列欧美呦日韩呦| 日本在线视频站| 欧美日韩日本国产| 最新av免费在线观看| 牛牛影视一区二区三区免费看| 日韩专区在线观看| 亚洲日本视频在线观看| 国产在线乱码一区二区三区| 久久精品国产综合精品| 国产区在线观看| 日韩欧美一区二区三区| 久久艹这里只有精品| 精品国产一区二区三区| 久久久久九九九九| 一级特黄录像免费看| 97se狠狠狠综合亚洲狠狠| 日本黄网站色大片免费观看| 欧美日韩成人影院| 亚洲国产欧美一区| 欧美激情图片小说| 日韩电影在线一区二区| 久久精品女人的天堂av| 丝袜在线视频| 欧美一区二区视频在线观看2020| xxxx日本免费| 亚洲巨乳在线| 91免费在线观看网站| 中文字幕在线播放| 一本久久a久久免费精品不卡| 日本少妇xxxx软件| 希岛爱理av一区二区三区| 国产精品69久久| 日本国产在线| 欧美日韩中文字幕| 久久福利小视频| 精品电影一区| 高清国产在线一区| av成人福利| 精品久久国产字幕高潮| 九九视频免费在线观看| 国产在线乱码一区二区三区| 中文字幕人成一区| 国产精品伦一区二区| 在线观看日韩欧美| 中文字幕激情视频| 国产精品乱码妇女bbbb| 亚洲 国产 图片| 久久人人99| 国产美女精品免费电影| 北岛玲日韩精品一区二区三区| 欧美性极品xxxx做受| 中文字幕一区二区人妻在线不卡| 亚洲美女黄网| 久久精品二区| 校园春色亚洲色图| 在线观看精品国产视频| 中文字幕在线观看国产| 成人欧美一区二区三区1314| 日韩av片专区| 国产一区观看| 国产一区喷水| 免费观看亚洲| 一区二区日韩精品| 91精品国产乱码久久久| 日韩一区有码在线| 久久无码人妻一区二区三区| 欧美a级在线| 国产精品av一区| 日韩精品极品| 伊人久久精品视频| 国产精品一区二区av白丝下载| 亚洲精品日韩专区silk| 超碰caoprom| 久久久久久色| 伊人av成人| 99这里只有精品视频| 欧美中在线观看| 亚洲精品承认| 精品区一区二区| 男人午夜免费视频| 中文字幕第一区第二区| 男生和女生一起差差差视频| 亚洲激情综合| 视频一区二区综合| 亚洲视频三区| 国产精品露脸自拍| 国产一线二线在线观看| 亚洲人成免费电影| 国产视频在线观看视频| 午夜视频在线观看一区二区三区| 美女被到爽高潮视频| 国产一区在线观看视频| 六月丁香激情网| 天天综合一区| 另类欧美小说| 久久av网站| 国产成人精品av在线| 免费影视亚洲| 中文字幕日韩电影| 人妻丰满熟妇av无码区hd| 欧美亚洲高清一区二区三区不卡| 欧美成人综合色| 亚洲国产成人午夜在线一区| 中文字幕人妻一区| 久久草av在线| 国产免费一区二区三区视频| 亚洲精品久久| 日本在线视频一区| 都市激情久久| 91中文字幕在线| 色香欲www7777综合网| 欧美精品18videos性欧美| 98在线视频| 亚洲欧美日韩国产中文专区| www.污视频| 91精品国产综合久久久蜜臀粉嫩| 麻豆成人免费视频| 亚洲国产一区二区视频| 四虎精品免费视频| 中文在线免费一区三区高中清不卡| 国产精品久久久久久亚洲色| 国内精品久久久久影院色| 免费看a级黄色片| 99国产精品视频免费观看一公开 | heyzo中文字幕在线| 久久久av一区| av在线首页| 国产亚洲一区二区在线| 男人的天堂在线| 日韩av在线资源| 女人18毛片水真多18精品| 欧美一区二区三区四区在线观看| 亚洲视频在线观看一区二区| 色天使色偷偷av一区二区| 国产精品人人人人| 岛国av一区二区三区| 国产午夜福利一区二区| 亚洲综合色网站| 午夜少妇久久久久久久久| 亚洲三级理论片| 色婷婷在线视频观看| 日韩毛片精品高清免费| 国产成人在线网址| 国产精品久久久久影院老司| www亚洲色图| 国产日韩欧美不卡| 免费看91的网站| 国产欧美精品国产国产专区| 日本欧美一区二区三区不卡视频| 国产亲近乱来精品视频| 卡一卡二卡三在线观看| 亚洲国产高清不卡| 在线观看黄网址| 国产精品天天摸av网| 亚洲一级理论片| 中文字幕一区日韩精品欧美| 亚洲精品电影院| 亚洲乱码中文字幕| 欧美人妻精品一区二区三区| 亚洲一级二级在线| 亚洲视频免费播放| 日韩欧美国产一区二区| 樱花视频在线免费观看| 欧美调教femdomvk| 国产孕妇孕交大片孕| 欧美一区二区三区四区久久| 欧美少妇bbw| 亚洲欧美激情四射在线日| 91在线视频| 不卡av在线播放| 91九色porn在线资源| 日韩免费不卡av| 亚洲精品aaa| 成人在线视频电影| 精品国产一区二区三区成人影院 | porn亚洲| 九色精品美女在线| 成人免费看黄| 国产一区视频在线| 成人av地址| 日韩在线三级| 欧美视频二区| 国产97色在线 | 日韩| 久久99精品国产麻豆婷婷洗澡| 佐佐木明希电影| 国产欧美日韩激情| 国产小视频在线观看免费| 日本高清不卡一区| www.污视频| 中文字幕国产精品久久| 成年人视频免费在线播放| 国产精品高潮呻吟久久av野狼 | 日本午夜精品电影| 中文一区一区三区免费在线观看| 久久久久久久久久久99| 老司机精品视频导航| 久久性爱视频网站| 国产精品欧美综合在线| www.99re7.com| 欧美日韩中文精品| 日本精品专区| 久久久久久12| 亚洲免费一区| 欧美国产综合视频| 激情欧美丁香| 日韩视频免费观看高清完整版在线观看 | 午夜视频在线瓜伦| 国产精品夜夜爽| 欧美成人另类视频| 欧美日韩色婷婷| 国产成人三级一区二区在线观看一| 亚洲精品一区二区在线| 中文国产字幕在线观看| 国产精品亚洲网站| 亚洲免费专区| 成人毛片一区二区| 国产不卡在线一区| 日本二区三区视频| 色成人在线视频| 秋霞av在线| 久久青草福利网站| 欧美区一区二区| 天天干天天操天天干天天操| 日本 国产 欧美色综合| 国产精品扒开腿做爽爽| 午夜在线成人av| 亚洲精品视频专区| 九九热在线精品视频| 国产视频一区二区在线播放| 性刺激综合网| 日韩影院精彩在线| 性欧美精品中出| 色国产精品一区在线观看| 三级毛片在线免费看| 国内精品400部情侣激情| 7m精品国产导航在线| 黄色小视频大全| 国产做a爰片久久毛片| 2017亚洲天堂| 欧美日韩亚洲综合在线| avtt亚洲| 91精品久久久久久久久| 成人精品亚洲| jizz欧美性11| 亚洲欧洲精品一区二区三区不卡| 综合久久中文字幕| 最近2019免费中文字幕视频三| 欧美xxxx做受欧美护士| 日韩高清三级| 麻豆精品一区二区综合av| 蜜桃av.com| 日韩一区二区三区视频在线观看| av在线免费观看网址| 亚洲综合中文字幕在线| 欧美在线不卡| 天堂www中文在线资源| 亚洲成av人片观看| 欧美高清成人| 国产欧美韩国高清| 中文字幕一区二区三区乱码图片 | 六月丁香激情网| 久久久久国产成人精品亚洲午夜 | 91国产精品视频在线| 国产精品毛片av| 丰满爆乳一区二区三区| 久久精品在线观看| 中文字幕第一页在线播放| 久久天天躁狠狠躁夜夜躁| 伊人久久大香线蕉av超碰| 国产3p露脸普通话对白| 国产性天天综合网| 亚洲综合一区中| 欧美日韩电影在线观看| 日韩一级电影| 欧美成年人视频在线观看| 一区二区三区中文在线观看| 日韩中文字幕观看| 国产精品高潮呻吟视频| 女人香蕉久久**毛片精品| 免费的av网站| 欧美美女喷水视频| 9765激情中文在线| 色噜噜色狠狠狠狠狠综合色一| 韩国av一区二区| 国产女同在线观看| 日韩在线中文视频| 福利在线一区| 91亚洲免费视频| 午夜久久久久久久久| 五月婷婷在线观看| 精品国产乱码久久久久久蜜柚| 首页亚洲欧美制服丝腿| 青娱乐国产在线视频| 亚洲欧美日韩中文视频| 韩国三级成人在线| 88av.com| 亚洲第一主播视频| 日本中文字幕视频在线| 久久久婷婷一区二区三区不卡|