【JAVA】【面試】【基礎篇】- 集合

程式設計師小姐姐發表於2019-10-30

再快不能快基礎,再爛不能爛語言!

【基礎篇】-集合

【JAVA】【面試】【基礎篇】- 集合

【JAVA】【面試】【基礎篇】- 集合

  • List 和 Set 區別

    List,Set都是繼承自Collection介面,List特點:有序可重複,Set特點:無序不可重複,重複元素會覆蓋掉

    Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。<實現類有HashSet,TreeSet>

    List:和陣列類似,List可以動態增長,查詢元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。<實現類有ArrayList,LinkedList,Vector>

  • List 和 Map 區別

    List是物件集合,允許物件重複。

    Map是鍵值對的集合,不允許key重複。

  • Arraylist 與 LinkedList 區別

    Arraylist:

    優點:ArrayList是實現了基於動態陣列的資料結構,因為地址連續,一旦資料儲存好了,查詢操作效率會比較高(在記憶體裡是連著放的)。

    缺點:因為地址連續, ArrayList要移動資料,所以插入和刪除操作效率比較低。

    LinkedList:

    優點:LinkedList基於連結串列的資料結構,地址是任意的,所以在開闢記憶體空間的時候不需要等一個連續的地址,對於新增和刪除操作add和remove,LinedList比較佔優勢。LinkedList 適用於要頭尾操作或插入指定位置的場景

    缺點:因為LinkedList要移動指標,所以查詢操作效能比較低。

    適用場景分析:

    當需要對資料進行對此訪問的情況下選用ArrayList,當需要對資料進行多次增加刪除修改時採用LinkedList。

  • ArrayList 與 Vector 區別

    public ArrayList(int initialCapacity)//構造一個具有指定初始容量的空列表。
    public ArrayList()//構造一個初始容量為10的空列表。
    public ArrayList(Collection<?  extends E> c)//構造一個包含指定 collection 的元素的列表
    複製程式碼
    public Vector()//使用指定的初始容量和等於零的容量增量構造一個空向量。
    public Vector(int initialCapacity)//構造一個空向量,使其內部資料陣列的大小,其標準容量增量為零。
    public Vector(Collection<? extends E> c)//構造一個包含指定 collection 中的元素的向量
    public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量構造一個空的向量
    複製程式碼

    ArrayList和Vector都是用陣列實現的,主要有這麼三個區別:

    1. Vector是多執行緒安全的,執行緒安全就是說多執行緒訪問同一程式碼,不會產生不確定的結果。而ArrayList不是,這個可以從原始碼中看出,Vector類中的方法很多有synchronized進行修飾,這樣就導致了Vector在效率上無法與ArrayList相比;

    2. 兩個都是採用的線性連續空間儲存元素,但是當空間不足的時候,兩個類的增加方式是不同。

    3. Vector可以設定增長因子,而ArrayList不可以。

    4. Vector是一種老的動態陣列,是執行緒同步的,效率很低,一般不贊成使用。

    適用場景分析:

    1. Vector是執行緒同步的,所以它也是執行緒安全的,而ArrayList是執行緒非同步的,是不安全的。如果不考慮到執行緒的安全因素,一般用ArrayList效率比較高。

    2. 如果集合中的元素的數目大於目前集合陣列的長度時,在集合中使用資料量比較大的資料,用Vector有一定的優勢。

  • HashMap 和 Hashtable 的區別

    1. hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。

    2. hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。

    3. hashMap允許空鍵值,而hashTable不允許。

    注意:

    • TreeMap:非執行緒安全基於紅黑樹實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。
    • Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。
  • HashSet 和 HashMap 區別

    set是線性結構,set中的值不能重複,hashset是set的hash實現,hashset中值不能重複是用hashmap的key來實現的。

    map是鍵值對對映,可以空鍵空值。HashMap是Map介面的hash實現,key的唯一性是通過key值hash值的唯一來確定,value值是則是連結串列結構。

    他們的共同點都是hash演算法實現的唯一性,他們都不能持有基本型別,只能持有物件

  • HashMap 和 ConcurrentHashMap 的區別

    ConcurrentHashMap是執行緒安全的HashMap的實現。

    • ConcurrentHashMap對整個桶陣列進行了分割分段(Segment),然後在每一個分段上都用lock鎖進行保護,相對於HashTable的syn關鍵字鎖的粒度更精細了一些,併發效能更好,而HashMap沒有鎖機制,不是執行緒安全的。
    • HashMap的鍵值對允許有null,但是ConCurrentHashMap都不允許。
  • HashMap 的工作原理及程式碼實現

【JAVA】【面試】【基礎篇】- 集合

  • ConcurrentHashMap 的工作原理及程式碼實現

    HashTable裡使用的是synchronized關鍵字,這其實是對物件加鎖,鎖住的都是物件整體,當Hashtable的大小增加到一定的時候,效能會急劇下降,因為迭代時需要被鎖定很長的時間。

    ConcurrentHashMap算是對上述問題的優化,其建構函式如下,預設傳入的是16,0.75,16。

    public ConcurrentHashMap(int paramInt1, float paramFloat, int paramInt2)  {
    //…
    int i = 0;
    int j = 1;
    while (j < paramInt2) {
      ++i;
      j <<= 1;
    }
    this.segmentShift = (32 - i);
    this.segmentMask = (j - 1);
    this.segments = Segment.newArray(j);
    //…
    int k = paramInt1 / j;
    if (k * j < paramInt1)
      ++k;
    int l = 1;
    while (l < k)
      l <<= 1;
     
    for (int i1 = 0; i1 < this.segments.length; ++i1)
      this.segments[i1] = new Segment(l, paramFloat);
     }
    public V put(K paramK, V paramV)  {
    if (paramV == null)
      throw new NullPointerException();
    int i = hash(paramK.hashCode()); //這裡的hash函式和HashMap中的不一樣  
    return this.segments[(i >>> this.segmentShift & this.segmentMask)].put(paramK, i, paramV, false);
    }
    複製程式碼

    ConcurrentHashMap引入了分割(Segment),上面程式碼中的最後一行其實就可以理解為把一個大的Map拆分成N個小的HashTable,在put方法中,會根據hash(paramK.hashCode())來決定具體存放進哪個Segment,如果檢視Segment的put操作,我們會發現內部使用的同步機制是基於lock操作的,這樣就可以對Map的一部分(Segment)進行上鎖,這樣影響的只是將要放入同一個Segment的元素的put操作,保證同步的時候,鎖住的不是整個Map(HashTable就是這麼做的),相對於HashTable提高了多執行緒環境下的效能,因此HashTable已經被淘汰了。

更詳細的面試總結連結請戳:??
juejin.im/post/5db8d9…

【推薦篇】- 書籍內容整理筆記 連結地址
【推薦】【Java程式設計思想】【筆記】 juejin.im/post/5dbb7a…
【推薦】【Java核心技術 卷Ⅰ】【筆記】 juejin.im/post/5dbb7b…

若有錯誤或者理解不當的地方,歡迎留言指正,希望我們可以一起進步,一起加油!??

相關文章