集合
如果你有更好的想法請在評論區留下您的答案,一起交流討論
-
說說常見的集合有哪些?
答:主要分List、Set、Map、Queue四類,其中包含ArrayList、LinkedList、HashSet、TreeSet、HashMap
-
Comparable和Comparator介面的區別?
答:其兩者的目的都是讓物件可比,第一種將需要比較的類可實作Comparable并重寫comparaTo方法制定比較規制,如此讓類本身具備可比性,無需依賴其他第三方類,第二種為需要比較的類再定義一個比較類,該類需要基礎Comparator介面實作compara方法傳入倆個需要物件的進行比較,該方法需要依賴第三方類,
-
集合使用泛型有什么優點?
答:泛型允許我們為集合提供一個可以容納的物件型別,因此,如果你添加其它型別的任何元素,它會在編譯時報錯,這避免了在運行時出現ClassCastException,因為你將會在編譯時得到報錯資訊,
-
List、Set、Map之間的區別是什么?
答:
特性不同
- List 有序可重復
- Set 無序不可重復
- Map KV形式存盤,無序Key不可重復
-
為什么Map介面不繼承Collection介面?
答:Map提供的是鍵值對映射(即Key和value的映射),而collection提供的是一組資料(并不是鍵值對映射),如果map繼承了collection介面,那么所有實作了map介面的類到底是用map的鍵值對映射資料還是用collection的一組資料呢(就我們平常所用的hashMap、hashTable、treeMap等都是鍵值對,所以它繼承collection完全沒意義),而且map如果繼承了collection介面的話還違反了面向物件的介面分離原則,
-
常用的執行緒安全的Map有哪些?
答:HashTable,ConcurrentHashMap
-
HashMap和Hashtable有什么區別?
答:
- HashMap的Key和Value都可以為Null,而HashTable的Key和Value都不能
- HashMap的執行緒不安全效率高,HashTable的執行緒安全效率低
- HashMap繼承的是AbstractMap,HashTable繼承的是Dictionary介面
-
HashMap和TreeMap怎么選?
答:存放的資料需要排序選擇TreeMap,不需要排序選擇HashMap,而且可以根據HashMap空間的使用,對初始容量和負載因子進行調優,
-
HashMap的資料結構是什么?
答:陣列+鏈表/紅黑樹,一般稱為“鏈表散列”
-
HashMap在JDK 8中有哪些改變?
答:JDK8之前HashMap采用的資料結構為陣列+鏈表,JDK8之后HashMap采用陣列+鏈表/紅黑樹,增加紅黑樹來優化鏈表過長時帶來的查詢性能消耗;
發生Hash沖突時
JDK7:插入鏈表的頭部,頭插法
JDK8:插入鏈表的尾部,尾插法 -
HashMap是怎么解決Hash沖突的?
答:
- 開放地址法:將散列演算法算出來的hash通過位移運算子向后位移,使存放地址向后移位,如果還在沖突就繼續移位
- 拉鏈發:在相同的散列位置處生產一個鏈表,鏈在沖突位置的后面
- 在Hash:重新計算Hash
- 建立公共溢位區
-
HashMap是怎么擴容的?
答:當存盤的資料量達到總容量的負載因子大小(默認0.75)時開始擴容,擴容會創建當前陣列大小的兩倍,再將原來的資料重新進行hash計算存盤位置,由此可見HashMap擴容對性能的消耗比較嚴重
-
HashMap如何實作同步?
答:
- Collections.synchronizedMap(HashMap物件)將HashMap轉變為執行緒安全的
- HashMap進行寫操作的步驟寫在synchronized同步代碼塊中
- 用lock
lock.lock();
Value = https://www.cnblogs.com/smart-rick/archive/2021/02/15/map.get(key);
lock.unlock();
-
ConcurrentHashMap的資料結構是什么?
答:CurrentHashMap的結構是Segment陣列的意義就是將一個大的table分割成多個小的table來進行加鎖,也就是上面的提到的鎖分離技術,而每一個Segment元素存盤的是HashEntry陣列+鏈表,這個和HashMap的資料存盤結構一樣,
-
ArrayList是執行緒安全的嗎?
答:執行緒不安全
-
常用執行緒安全的List集合有哪些?
答:Vector、以及通過java.util.Collections.SynchronizedList將任何List轉換為執行緒安全、CopyOnWriteArrayList復制寫入,添加元素時先加鎖并且復制一份原來的List再添加元素,最后釋放鎖,
-
回圈洗掉List集合可能會發生什么例外?
答:會導致陣列元素位移,造成元素誤刪,解決辦法是倒著洗掉或者使用迭代器遍歷時洗掉
-
ArrayList和LinkedList有什么區別?
答:資料結構不同,ArrayList底層采用陣列,查詢快增加或洗掉慢(涉及到資料元素位移),LinkedList底層采用鏈表結構,查詢慢,增加洗掉快
-
ArrayList和Vector有什么區別?
答:ArrayList執行緒不安全效率高,Vector執行緒安全效率低
-
什么是CopyOnWriteArrayList?
答:CopyOnWriteArrayList是ArrayList的一個執行緒安全的變體,其中所有可變操作(add、set等等)都是通過對底層陣列進行一次新的復制來實作的,相比較于ArrayList它的寫操作要慢一些,因為它需要實體的快照,
CopyOnWriteArrayList中寫操作需要大面積復制陣列,所以性能肯定很差,但是讀操作因為操作的物件和寫操作不是同一個物件,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完后通過一個簡單的"="將參考指向新的陣列物件上來,這個幾乎不需要時間,
-
什么是fail-safe?
答:當我們對集合結構上做出改變的時候,fail-fast機制就會拋出例外,但是,對于采用fail-safe機制來說,就不會拋出例外
這是因為,當集合的結構被改變的時候,fail-safe機制會在復制原集合的一份資料出來,然后在復制的那份資料遍歷,
-
什么是fail-fast?
答:fail-fast的字面意思是“快速失敗”,當我們在遍歷集合元素的時候,經常會使用迭代器,但在迭代器遍歷元素的程序中,如果集合的結構被改變的話,就會拋出例外,防止繼續遍歷,這就是所謂的快速失敗機制,fail-fast,即快速失敗機制,它是java集合中的一種錯誤檢測機制,當多個執行緒(單個執行緒也是可以滴),在結構上對集合進行改變時,就有可能會產生fail-fast機制,
-
fail-fast和fail-safe有什么區別?
答:
fail-safe機制
fail-safe任何對集合結構的修改都會在一個復制的集合上進行修改,因此不會拋出ConcurrentModificationException
fail-safe機制有兩個問題
(1)需要復制集合,產生大量的無效物件,開銷大
(2)無法保證讀取的資料是目前原始資料結構中的資料,
fail-fast機制
fail-fast機制在遍歷一個集合時,當集合結構被修改,會拋出Concurrent Modification Exception,
fail-fast會在以下兩種情況下拋出ConcurrentModificationException
(1)單執行緒環境
集合被創建后,在遍歷它的程序中修改了結構,
注意 remove()方法會讓expectModcount和modcount 相等,所以是不會拋出這個例外,
(2)多執行緒環境
當一個執行緒在遍歷這個集合,而另一個執行緒對這個集合的結構進行了修改,
-
HashSet的底層實作原理是什么?
答:HashSet底層依賴與HashMap進行資料存盤,HashSet的元素就是HashMap中的Key,而Value則為Null
-
怎么確保一個集合不能被修改?
答:兩種實作方式,Collections. unmodifiableCollection(Collection c) 方法創建的集合(
最侄訓回傳一個由Collections.UnmodifiableCollection類,該類對所有的寫操作都進行了重寫覆寫,使其拋出UnsupportedOperationException例外),和使用Arrays.asList創建的集合(回傳了一個Arrays的靜態內部類ArrayList,原理與Collections.UnmodifiableCollection差不多),
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259922.html
標籤:其他
上一篇:【C++四種cast轉換的學習】 const_cast,static_cast, dynamic_cast, reinterpret_cast
