list介面(基礎)
特點:實作list介面的類,有順序,并且存入時允許出現重復值;
list介面的實作類
ArrayList類(最常用的list介面的實作類)
存盤結構:
ArrayList集合中是按照Object[ ]陣列存盤的;
//<T>中T決定陣列中存放的資料的資料型別
ArrayList<String> list01 = new ArrayList<String>();
初始化:
// 使用無參構造方法,按照空陣列的方式初始化內部陣列
// 第一次添加元素時,長度初始化為默認值10
ArrayList<String> list1 = new ArrayList<String>();
// 使用有參構造方法,按照指定的容量,初始化內部陣列
// 長度初始化為指定值38
ArrayList<String> list2 = new ArrayList<String>(38);
擴容機制:
當陣列容量不足時,自動擴容,擴容后的新陣列長度是原陣列長度的1.5倍(newCapacity = oldCapacity + (oldCapacity >> 1););
//ArrayList的擴容的源代碼 JDK1.8
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
當擴容時,擴容的長度小于零時,拋出OutOfMemoryError錯誤,最小長度大于Integer的最大值-8時,擴容的新陣列長度為Integer的最大值,若是小于Integer的最大值-8,擴容的新陣列長度是Integer的最大值-8;
// MAX_ARRAY_SIZE Integer的最大值-8
// Integer.MAX_VALUE Integer的最大值
// minCapacity 最小需要的陣列長度
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE:MAX_ARRAY_SIZE;
}
常用方法可參考ArrayList集合的常用方法
Vector類
特點(相比ArrayList類而言):
Vector集合的方法中大部分使用了synchronized同步鎖,執行緒安全,不過由于加入了鎖,導致性能比較差;
存盤結構:
Vector集合中是按照Object[ ]陣列存盤的;
初始化:
// 無參構造方法創建Vector集合,內部陣列長度默認為10
Vector<String> list1 = new Vector<String>();
// 有參構造方法創建Vector集合,內部陣列長度由傳入的引數決定
// 初始長度為18
Vector<String> list2 = new Vector<String>(18);
// 有參構造方法創建Vector集合
// 內部陣列長度由出入的第一個引數決定,每次擴容增長由第二個引數決定
// 初始長度為18,每次增長5個長度
Vector<String> list3 = new Vector<String>(18,5);
擴容機制:
當陣列容量不足時,自動擴容①擴容后的新陣列長度是原陣列長度的2倍(無參構造方法,只有一個引數的有參構造)②擴容后的新陣列長度比原來的陣列長度多第二個引數個(有參構造方法傳入兩個引數);
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//用于判斷新陣列長度是使用舊陣列長度的二倍,還是增長第二個引數個
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
//和ArrayList類中的hugeCapacity()方法作用一致
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
常用方法:
Vector類的常用方法與ArrayList類的常用方法基本類似;
LinkedList類
特點(相比ArrayList類而言):
LinkedList集合在插入和洗掉操作速度比較快,但查詢和遍歷操作相對較慢;
存盤結構:
LinkedList集合在存盤結構上采用了雙向鏈表的方式存盤,其中每一個塊存盤的是一個Node物件(Node類是LinkedList中的靜態內部類),在Node物件中item保存當前節點的資料,prev指向上一個節點,next指向下一個節點;
擴容方式:
由于LinkedList集合采用是雙向鏈表存盤的,因此每添加一個元素,就會創建一個Node物件,默認添加至鏈表尾部;
常用方法:
除去實作了List介面的類都有的方法之外,LinkedList中也包含了一些獨有的方法;
(1) addFirst()方法和addLast()方法
作用:給頭部添加元素(addFirst),給尾部添加元素(addLast);
引數:需要添加的元素;
回傳:無;
List<String> list = Arrays.asList("AAA","BBB","CCC");
LinkedList<String> lklist = new LinkedList<String>(list);
lklist.addFirst("DDD");
System.out.println(lklist);//輸出:[DDD, AAA, BBB, CCC]
lklist.addLast("EEE");
System.out.println(lklist);//輸出:[DDD, AAA, BBB, CCC, EEE]
(2) getFirst()方法和getLast()方法
作用:獲取鏈表頭部元素(getFirst),獲取鏈表尾部元素(getLast);
引數:無;
回傳:獲取到的元素;
List<String> list = Arrays.asList("AAA","BBB","CCC");
LinkedList<String> lklist = new LinkedList<String>(list);
System.out.println(lklist.getFirst());//輸出:AAA
System.out.println(lklist.getLast());//輸出:CCC
(3) removeFirst()方法和removeLast()方法
作用:洗掉鏈表頭部元素(removeFirst),洗掉鏈表尾部元素(removeLast);
引數:無;
回傳:洗掉的元素;
//當需要洗掉的元素為空時拋出NoSuchElementException例外
List<String> list = Arrays.asList("AAA","BBB","CCC","DDD","EEE");
LinkedList<String> lklist = new LinkedList<String>(list);
System.out.println(lklist.removeFirst());//輸出:AAA
System.out.println(lklist);//輸出:[BBB, CCC, DDD, EEE]
System.out.println(lklist.removeLast());//輸出:EEE
System.out.println(lklist);//輸出:[BBB, CCC, DDD]
(4) peek()方法,peekFirst()方法和peekLast()方法
作用:檢查頭部元素是否為空(peek,peekFirst),檢查尾部元素是否為空(peekLast);
引數:無;
回傳:如果為慷訓傳null,不為慷訓傳該元素值;
List<String> list = Arrays.asList("AAA","BBB","CCC","DDD","EEE");
LinkedList<String> lklist = new LinkedList<String>(list);
System.out.println(lklist.peek());//輸出:AAA
System.out.println(lklist.peekFirst());//輸出:AAA
System.out.println(lklist.peekLast());//輸出:EEE
(5) poll()方法,pollFirst()方法和pollLast()方法
作用:檢查頭部元素,并洗掉(poll,pollFirst),檢查尾部元素,并洗掉(pollLast);
引數:無;
回傳:如果為慷訓傳null,不為慷訓傳該元素值并將其洗掉;
// poll()方法在集合中的元素為空時,回傳一個null
List<String> list = Arrays.asList("AAA","BBB");
LinkedList<String> lklist = new LinkedList<String>(list);
System.out.println(lklist.poll());//輸出:AAA
System.out.println(lklist);//輸出:[BBB]
System.out.println(lklist.pollFirst());//輸出:BBB
System.out.println(lklist);//輸出:[]
System.out.println(lklist.pollLast());//輸出:null
(6) pop()方法
作用:彈出首部元素;
引數:無;
回傳:被彈出的元素;
List<String> list = Arrays.asList("AAA","BBB","CCC","DDD","EEE");
LinkedList<String> lklist = new LinkedList<String>(list);
System.out.println(lklist.pop());//輸出:AAA
System.out.println(lklist.pop());//輸出:BBB
System.out.println(lklist);//輸出:[CCC, DDD, EEE]
以上就是list介面實作類的特點等,僅代表個人觀點,若有錯誤的地方希望各位大佬多多指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251747.html
標籤:java
