面試中經常問到的集合問題
幾天複習了Java集合的知識點,總結一下。
一.Vector和ArrayList的比較
1.Vector的方法是執行緒同步的,是執行緒安全的,ArrayList的方法不是,是執行緒不安全的。所以ArrayList比Vector的效能高。
2.兩者在擴容時不同,Vector是變為原來的兩倍,ArrayList是擴為原來的1.5倍。ArrayList相對來說比較節約記憶體空間。
3.Vector可以自定義增長因子,ArrayList不可以。
4.相同點是兩者的初始容量都為10.
使用場景:
因為Vector是執行緒安全的,所以在多執行緒情況下使用Vector,不考慮執行緒安全的因素的時候,一般使用ArrayList比較好。
二.ArrayList和LinkedList的比較。
1.ArrayList的是基於動態陣列的(地址是連續的),查詢和修改比較快;而LinkedList是基於創想迴圈連結串列的,增加和刪除操作 比較快。
2.ArrayList允許為空,LinkedList允許為NUll元素。
使用場景:
當需要對資料進行訪問時選用ArrayList,需要對資料進行增刪時選擇LinkedList。
三.HashSet和TreeSet的比較。
1.HashSet是hash表實現的,TreeSet時二叉樹實現的。
2.TreeSet中的資料是自動排好序的,不允許為為null;HashSet中的元素是無序的,可以為null但是能有一個。TreeSet和 HashSet中的元素都不能重複。
3.HashSet要求放入的元素必須實現hashcode()方法,因為HashSet判斷兩個元素是否相同實質上就是hashcode碼是否相 同。
適用場景:
因為HashSet是hash表實現的所以效能優於TreeSet,一般使用HashSet,當遇到排序問題時,則選擇TreeSet(因為TreeSet實現了SortedSet介面)。
四.HashMap和ConcurrentHashMap的比較。
1.HashMap是執行緒不安全的,而ConcurrentHashMap是執行緒安全的。
2.ConcurrentHashMap採用分段鎖機制實現執行緒安全,將整個Hash桶進行了分段segment,將大資料分成幾個小片段 segment,每個segment上有鎖存在。在插入元素的時候先找到相對應的segment和segment鎖,而後對其進行操作。
五.HashTable和ConcurrentHashMap的比較。
兩者都是執行緒安全的,但是HashTable是在成員方法前加Synchronized鎖,當資料量較大時HashTable的效能比較低,因為迭代時需要被鎖住很長時間;而ConcurrentHashMap使用的是分段鎖機制(對區域性加鎖)。
六.集合中執行緒安全的有:Vector、Stack、HashTable、Enumeration(列舉)
七.解決Hash衝突的方法:拉鍊法、開放地址法、建立公共溢位區、再雜湊法。