再快不能快基礎,再爛不能爛語言!
【基礎篇】-集合
-
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都是用陣列實現的,主要有這麼三個區別:
-
Vector是多執行緒安全的,執行緒安全就是說多執行緒訪問同一程式碼,不會產生不確定的結果。而ArrayList不是,這個可以從原始碼中看出,Vector類中的方法很多有synchronized進行修飾,這樣就導致了Vector在效率上無法與ArrayList相比;
-
兩個都是採用的線性連續空間儲存元素,但是當空間不足的時候,兩個類的增加方式是不同。
-
Vector可以設定增長因子,而ArrayList不可以。
-
Vector是一種老的動態陣列,是執行緒同步的,效率很低,一般不贊成使用。
適用場景分析:
-
Vector是執行緒同步的,所以它也是執行緒安全的,而ArrayList是執行緒非同步的,是不安全的。如果不考慮到執行緒的安全因素,一般用ArrayList效率比較高。
-
如果集合中的元素的數目大於目前集合陣列的長度時,在集合中使用資料量比較大的資料,用Vector有一定的優勢。
-
-
HashMap 和 Hashtable 的區別
-
hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
-
hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
-
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 的工作原理及程式碼實現
-
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… |
若有錯誤或者理解不當的地方,歡迎留言指正,希望我們可以一起進步,一起加油!??