JAVA集合框架中的各種區別與比較
阿新 • • 發佈:2018-12-09
1、List Set Map 的區別
- List: 有序,可以多個元素引用相同的物件
- Set: 無序,不重複,不可以多個元素引用相同物件
- Map: 使用鍵值對儲存,兩個key可以引用相同的物件,但是key不能重複
2、ArrayList 和LinkedList 區別
- ArrayList: 底層使用陣列,存、讀效率高;插入、刪除特定位置效率低,近似O(n)
- LinkedList: 使用雙向連結串列,插入、刪除效率高O(1)
3、ArrayList 和 Vector 區別
- Vector的所有方法都是同步的,ArrayList不同步
- 由於Vector類的方法都是使用了synchronized,所以效率比ArrayList低很多
4、HashMap 和 HashTable的區別
- HashMap 是執行緒不安全的,HashTable執行緒安全
- HashMap 效率高一點
- HashMap 可以有null 值,HashTable 有Null會產生NullPointerException異常
- HashTable 基本淘汰,需執行緒安全使用ConcurrentHashMap
5、HashMap 和 ConcurrentHashMap 區別
- ConcurrentHashMap 把整個桶陣列分割成很多個Segment,每個分段使用lock鎖保護(1.8之後使用CAS演算法)
- HashMap鍵值對允許有null,ConcurrentHashMap反之。
CAS演算法 compare and swap
- 無鎖演算法,CAS的語義是“我認為V的值應該為A,如果是,那麼將V的值更新為B,否則不修改並告訴V的值實際為多少”
6、HashSet 和 HashMap 區別
7、HashSet 檢查重複
當你把物件加入HashSet時,HashSet會先計算物件的hashcode值來判斷物件加入的位置,同時也會與其他加入的物件的hashcode值作比較,如果沒有相符的hashcode,HashSet會假設物件沒有重複出現。但是如果發現有相同hashcode值的物件,這時會呼叫equals()方法來檢查hashcode相等的物件是否真的相同。如果兩者相同,HashSet就不會讓加入操作成功。
8、hashCode() 和 equals()
- 如果兩個物件相等,則hashcode一定也是相同的
- 兩個物件相等,對兩個equals方法返回true
- 兩個物件有相同的hashcode值,它們也不一定是相等的
- 綜上,equals方法被覆蓋過,則hashCode方法也必須被覆蓋
- hashCode()的預設行為是對堆上的物件產生獨特值。如果沒有重寫hashCode(),則該class的兩個物件無論如何都不會相等(即使這兩個物件指向相同的資料)。