1. 程式人生 > >JAVA集合框架中的各種區別與比較

JAVA集合框架中的各種區別與比較

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()

  1. 如果兩個物件相等,則hashcode一定也是相同的
  2. 兩個物件相等,對兩個equals方法返回true
  3. 兩個物件有相同的hashcode值,它們也不一定是相等的
  4. 綜上,equals方法被覆蓋過,則hashCode方法也必須被覆蓋
  5. hashCode()的預設行為是對堆上的物件產生獨特值。如果沒有重寫hashCode(),則該class的兩個物件無論如何都不會相等(即使這兩個物件指向相同的資料)。