基礎-JAVA集合型別主要區別
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
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是自己實現的
HashMap | HashSet |
---|---|
實現了Map介面 | 實現了Set介面 |
鍵值對儲存 | 只儲存值 |
新增put() | 新增元素add() |
使鍵計算Hashcode | 使用成員物件計算 |
7、HashSet如何檢查重複
待更新 複述了JAVAGUIDE
相關文章
- Python - 基礎資料型別 set 集合Python資料型別
- Java基礎-基本型別和包裝型別Java型別
- java資料型別基礎Java資料型別
- [java基礎]之資料型別Java資料型別
- java的8種基礎型別Java型別
- java基礎(十) 陣列型別Java陣列型別
- java基礎(十一) 列舉型別Java型別
- Python基礎之集合和資料型別轉換Python資料型別
- java基礎知識--資料型別Java資料型別
- 基礎篇:JAVA引用型別和ThreadLocalJava型別thread
- 談談Java基礎資料型別Java資料型別
- Java基礎教程(15)–列舉型別Java型別
- java基礎(一) 深入解析基本型別Java型別
- JAVA基礎之九-泛型(通用型別)Java泛型型別
- java基礎之java的基本資料型別Java資料型別
- TypeScript型別系統和基礎型別TypeScript型別
- Java基礎語法之資料型別Java資料型別
- JAVA基礎--資料型別和運算子Java資料型別
- java基礎型別原始碼解析之HashMapJava型別原始碼HashMap
- java基礎之一:基本資料型別Java資料型別
- [Java基礎]之 資料型別轉換Java資料型別
- java基礎一:基本型別,運算子號Java型別
- java 基礎型別與byte[]的轉換Java型別
- go語言資料型別-基礎型別Go資料型別
- Guava集合--新集合型別Guava型別
- Java基礎-- ==號與equals()方法的區別Java
- Java基礎- ==和equals和hashCode的區別Java
- List型別集合型別
- day 7 – 1 集合、copy及基礎資料型別彙總資料型別
- typeScript 基礎型別 (三)TypeScript型別
- TypeScript(3)基礎型別TypeScript型別
- (JS基礎)String 型別JS型別
- 基礎資料型別資料型別
- 『Java 語法基礎』a = a + b 與 a += b 的區別Java
- [java基礎]StringBuilder和StringBuffer的3個區別JavaUI
- python 集合型別 setPython型別
- 基礎篇:深入解析JAVA泛型和Type型別體系Java泛型型別
- PHP基礎-資料型別PHP資料型別