基礎-JAVA集合型別主要區別

醬油瓶啤酒杯發表於2020-12-07

1、List,Set,Map三者的區別

  • List 儲存一組不唯一的,有序的物件
  • Set 不允許重複
  • Map 使用鍵值對儲存 key不能重複

2、ArrayList和LinkedList的區別

  • 相同之處:二者都不同步,執行緒不安全
  • 底層資料結構:ArrayList使用Object陣列儲存,插入和刪除元素複雜度受到元素位置的影響;LinkedList使用連結串列儲存,add(E element)刪除時時間複雜度不受位置影響,指定位置受影響add(int index, E element)
  • 快速隨機訪問get(int index):ArrayList支援 LinkedList不支援
  • 記憶體空間:ArrayList在結尾預留空間,LinkedList要存放後繼、前驅和資料
  • ArrayList 實現了RandomAccess 介面, LinkedList沒有實現?。因為ArrayList 底層是陣列,支援隨機訪問O(1);LinkedList需要遍歷到位置才能訪問指定元素O(n)

遍歷List

  • 實現了RandomAccess介面的List,優先使用for迴圈,之後是foreach

  • 未實現RandomAccess介面的List,優先使用iterator遍歷,大規模資料切記使用for迴圈

3、ArrayList和Vector的區別?為什麼用前者取代Vector?

  • ArrayList出現於jdk1.2,vector出現於1.0.兩者底層的資料儲存都使用的Object陣列實現,因為是陣列實現,所以具有查詢快、增刪慢(因為往陣列中間增刪元素時,會導致後面所有元素地址的改變)的特點
  • 都實現了RandomAccess介面
  • Vector類的方法都是同步的,可以由兩個執行緒安全訪問一個Vector物件,但是一個執行緒訪問的放會在同步問題上耗費大量的時間

  • ArrayList不是同步的,不需要耗費精力保證執行緒安全

ArrayList擴容機制

  • 第一步:把原來的陣列複製到另外一個記憶體空間更大的陣列中
  • 第二步:把新元素新增到擴容後的陣列中

不帶引數和帶引數的兩種建構函式

  • 在無參構造中,我們看到了在用無參構造來建立物件的時候其實就是建立了一個空陣列,長度為0
  • 在有參構造中,傳入的引數是正整數就按照傳入的引數來確定建立陣列的大小,否則異常

無參構造:

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

帶參構造:

public ArrayList(int initialCapacity) {

if (initialCapacity >0) {
    this.elementData =new Object[initialCapacity];
}else if (initialCapacity ==0) {
    this.elementData = EMPTY_ELEMENTDATA;
}else {
    throw new IllegalArgumentException("Illegal Capacity: "+
                                       initialCapacity);
}

}

4、擴容 add(E e) 原始碼如下

public boolean add(E e){
    ensureCapacityInternal(size+1);
    elementData[size++] = e;
    return true;
}
ArrayList每次擴容是原來的1.5倍

5、HashMap和HashTable的區別

  • HashMap非執行緒安全;HashTable是執行緒安全的,內部的方法基本經過synchronized修飾。
  • HashMap效率更高(和非執行緒安全有關係)
  • HashTable 基本要被淘汰
  • HashMap可以使用一個null作為健,和多個null作為值(HashTbable鍵值有null就丟擲NullPointException異常)
  • HashTable不指定容量則預設11,擴容後2n+1;HashMap預設16,擴充2n
  • HashMap總使用2的冪次方作為雜湊表的大小,HashTable開始會使用指定大小
  • HashMap和HashTabl都是雜湊表資料結構,都用連結串列解決衝突。
  • HashMap在JDK1.8之後解決雜湊衝突變化:當連結串列長度大於閾值(預設8)時,將連結串列轉化為紅黑樹,以減少搜尋時間。

6、HashMap和HashSet的區別

  • HashSet底層是基於HashMap實現的,只有clone、writeObject、readObject是自己實現的
HashMapHashSet
實現了Map介面實現了Set介面
鍵值對儲存只儲存值
新增put()新增元素add()
使鍵計算Hashcode使用成員物件計算

7、HashSet如何檢查重複

待更新 複述了JAVAGUIDE

相關文章