JAVA面試要點-集合-精簡答案

JAVA面試要點-集合-精簡答案

List 和 Set 區別

List,Set都是繼承自Collection接口,

List特點:元素有放入順序,元素可重複 ,Set特點:元素無放入順序,元素不可重複,重複元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標來取得想要的值。)

Set和List對比:

Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。

List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。

注意點:

set --其中的值不允許重複,無序的數據結構

list --其中的值允許重複,因為其為有序的數據結構

List 和 Map 區別

List接口 繼承collection接口,Map是個頂級接口List此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據元素的整數 索引(在列表中的位置)訪問元素,並搜索列表中的元素map將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值簡單的說就是list只能保存一列表;Map能保存2列表

Arraylist 與 LinkedList 區別

ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 (LinkedList是雙向鏈表,有next也有previous)

對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指針。

對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動數據。

Arraylist 與 LinkedList 性能差異

對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Entry對象。

在ArrayList集合中添加或者刪除一個元素時,當前的列表所所有的元素都會被移動。而LinkedList集合中添加或者刪除一個元素的開銷是固定的。

LinkedList集合不支持 高效的隨機隨機訪問(RandomAccess),因為可能產生二次項的行為。

ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

對元素的增刪查操作的時候,進行 查操作時用ArrayList,進行增刪操作的時候最好用LinkedList。

ArrayList 與 Vector 區別

JAVA面試要點-集合-精簡答案

1、Vector是線程安全的,ArrayList不是線程安全的。

2、ArrayList在底層數組不夠用時在原來的基礎上擴展0.5倍,Vector是擴展1倍。

HashMap 和 Hashtable 的區別

繼承的父類不同

Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。

線程安全性不同

javadoc中關於hashmap的一段描述如下:此實現不是同步的。如果多個線程同時訪問一個哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須保持外部同步。

Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize的。

是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解。

Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。

key和value是否允許null值

Hashtable中,key和value都不允許出現null值。但是如果在Hashtable中有類似put(null,null)的操作,編譯同樣可以通過,因為key和value都是Object類型,但運行時會拋出NullPointerException異常,這是JDK的規範規定的。

HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

還有以下不同


Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式

哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

HashTable在不指定容量的情況下的默認容量為11,而HashMap為16,Hashtable不要求底層數組的容量一定要為2的整數次冪,而HashMap則要求一定為2的整數次冪。

HashSet 和 HashMap 區別

JAVA面試要點-集合-精簡答案

HashMap 和 ConcurrentHashMap 的區別

最大的區別就是ConcurrentHashMap是線程安全的,hashMap不是線程安全的。為什麼線程安全呢:ConcurrentHashMap代碼中可以看出,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個小的HashTable,根據key.hashCode()來決定把key放到哪個HashTable中。在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現根據key.hashCode()算出放到哪個Segment中: 

HashMap 的 工作原理理及代碼實現

1. 什麼時候會使用HashMap?他有什麼特點?

是基於Map接口的實現,存儲鍵值對時,它可以接收null的鍵值,是非同步的,HashMap存儲著Entry(hash, key, value, next)對象。

2. 你知道HashMap的工作原理嗎?

通過hash的方法,通過put和get存儲和獲取對象。存儲對象時,我們將K/V傳給put方法時,它調用hashCode計算hash從而得到bucket位置,進一步存儲,HashMap會根據當前bucket的佔用情況自動調整容量(超過Load Facotr則resize為原來的2倍)。獲取對象時,我們將K傳給get,它調用hashCode計算hash從而得到bucket位置,並進一步調用equals()方法確定鍵值對。如果發生碰撞的時候,Hashmap通過鏈表將產生碰撞衝突的元素組織起來,在Java 8中,如果一個bucket中碰撞衝突的元素超過某個限制(默認是8),則使用紅黑樹來替換鏈表,從而提高速度。

JAVA面試要點-集合-精簡答案

JAVA面試要點-集合-精簡答案

JAVA面試要點-集合-精簡答案

ConcurrentHashMap 的 工作原理及代碼實現

為何用ConcurrentHashMap

在併發編程中使用HashMap可能會導致死循環,而使用線程安全的HashTable效率又低下。

ConcurrentHashMap的鎖分段技術

HashTable容器在競爭激烈的併發環境效率低下的原因是所有訪問HashTable的線程都必須競爭同一把鎖,假如容器有多把鎖,每一把鎖用於鎖住容器中一部分數據,那麼多線程訪問容器裡不同數據段的數據時,線程間就不會存在鎖競爭,從而可以有效提高併發訪問率,這就是ConcurrentHashMap的鎖分段技術。將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程佔用鎖訪問其中一段數據的時候,其他段的數據也能被其他線程訪問。

JAVA面試要點-集合-精簡答案

要了解更深入的同學只能再去查閱下資料


持續未完,關注是資料更新的動力!!


分享到:


相關文章: