日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗?

發布時間:2023/12/10 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言集合作為Java基礎知識的核心部分,不論是在面試還是平時工作中都是經常遇見的。當然面對熟悉的List、Set、Map,面試管的提問一般也都不會從簡單的問題出發了,今天就來聊下集合中的高級部分,讓你對它們的理解更加清楚。

一、List、Map、Set三個接口,存取元素時,各有什么特點?

(1)Set集合的add有一個boolean類型的返回值,當集合中沒有某個元素時,則可以成功加入該 元素,返回結果為true;當集合中存在與某個元素equals方法相等 的元素時,則無法加入該元素, 取元素時只能用Iterator接口取得所有元素,在逐一遍歷各個元素;

(2)List表示有先后順序的集合,調用add()方法,指定當前對象在集合中的存放位置;一個對象可 以被反復存進集合中;每調用一次add()方法,該對象就會被插入集合中一次,其實,并不是把對 象本身存進了集合中,而是在集合中使用一個索引變量指向了該對象,當一個對象被add多次時, 即有多個索引指向了這個對象。List去元素時可以使用Iterator取出所有元素,在逐一遍歷,還可 以使用get(int index)獲取指定下表的元素;

(3)Map是雙列元素的集合,調用put(key,value),要存儲一對key/value,不能存儲重復的key, 這個是根據eauals來判斷;取元素時用get(key)來獲取key所對 應的value,另外還可以獲取 全部key,全部value。

二. ArrayList 遍歷方式

  • 第 1 種,普通 for 循環隨機訪問,通過索引值去遍歷。

// 隨機訪問 List list = new ArrayList<>(); int size = list.size(); for (int i = 0; i < size; i++) { value = list.get(i);?????}
  • 第 2 種,通過迭代器遍歷。即通過 Iterator 去遍歷。

// 迭代器遍歷 Iterator iter = list.iterator(); while (iter.hasNext()) { value = iter.next();????}
  • 第 3 種,增強 for 循環遍歷。

// 增強 for 循環 for (String s : list) { value = s;????}
  • 第 4 種 forEach + lambda 循環遍歷

list.forEach(p -> { p.hashCode();????????????});結論:如果數據量比較少的話貌似四種循環耗時都差不多,但是隨著數據量的增長會發現 foreach 的效率是最好的。但是從上面我們會發現一個奇怪的現象,第一次循環的時候forEach遍歷的時間是最長的盡管數據量非常少也會這樣。但是后面的耗時就正常了。如果放開測試里面的預熱代碼,每次跑出來的耗時也是正常的。

三、ArrayList和LinkedList的底層實現原理?他們為什么線程不安全?在多線程并發操作下,我們應該用什么替代?

1.ArrayList底層通過數組實現,ArrayList允許按序號索引元素,而插入元素需要對數組進行移位等內存操作,所以索引快插入較慢;(擴容方式)一旦我們實例化了ArrayList 無參構造函數默認數組長度為10。add方法底層如 果增加的元素超過了10個,那么ArrayList底層會生成一個新的數組,長度為原來數組長度的1.5倍+1,然后將原數組內容復制到新數組中,并且后續加的內容都會放到新數組中。當新數組無法容納增加元素時,重復該過程;

2.LinkedList底層通過雙向鏈表實現,取元素時需要進行前項或后項的遍歷,插入元素時只需要記錄本項的前后 項即可,所以插入快查詢慢;

3.ArrayList和LinkedList底層方法都沒有加synchronized關鍵詞,多線程訪問時會出現多個線程先后更改數據造成得到的數據是臟數據;多線程并發操作下使用Vector來代替,Vector底層也是數組,但底層方法都加synchronized關鍵字使線程安全,效率較ArrayList差;

四、HashMap和HashTable有什么區別?其底層實現是什么?CurrentHashMap的鎖機制又是如何?如果想將一個Map變為有序的,該如何實現?

1.區別:
(1)HashMap沒有實現synchronized線程非安全,HashTable實現了synchronized線程安全;
(2)HashMap允許key和value為null,而HashTable不允許

2.底層原理:數組+鏈表實現

3.ConcurrentHashMap鎖分段技術:HashTable效率低下的原因,是因為所訪問HashTable的線程都必須競爭同一把鎖,那假如容器中有多把鎖,每一把鎖用于鎖住容器中的一部分數據,那么當多線程訪問容器中不同的數據時,線程間就不會存在鎖競爭,從而提高并發訪問率;ConcurrentHashMap使用的就是鎖分段技術,首先將數據分成一段一段的存儲,然后給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個數據時,其他段的數據也能被其他線程訪問;

4.實現TreeMap

五.ArryList 注意點

謹慎使用 ArrayList 中的 subList 方法

  • ArrayList 的 subList 結果不可強轉成 ArrayList,否則會拋出 ClassCastException 異常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList. 說明:subList 返回的是 ArrayList 的內部類 SubList,并不是 ArrayList ,而是 ArrayList 的一個視圖,對于 SubList 子列表的所有操作最終會反映到原列表上。

Listlist = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); ArrayList strings = (ArrayList)list.subList(0, 1);運行結果:Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList??at?com.workit.demo.listener.ArrayListTest.main(ArrayListTest.java:29)
  • 在 subList 場景中,高度注意對原集合元素個數的修改,會導致子列表的遍歷、增加、 刪除均會產 ConcurrentModificationException 異常。

Listlist = new ArrayList<>(); list.add("1"); list.add("1"); list.add("2"); List subList = list.subList(0, 1); // 對原 List 增加一個值 list.add("10");????????subList.add("11");?//?這一行會報?java.util.ConcurrentModificationException
  • 初始化 List 的時候盡量指定它的容量大小。(盡量減少擴容次數)

END最后,針對面試我們也有很多專題資料,讓你事半功倍

教你如何寫高級的前端簡歷【附簡歷導圖】

2020-08-14

電話面試-帶你領略高級技巧

2020-02-27

打開職場的鑰匙“簡歷”

2019-11-24


關注我們,更多資料等你來

總結

以上是生活随笔為你收集整理的list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。