目錄
?擴容機制
ArrayList擴容源碼
Vector擴容源碼
二者區別
擴展:stack(棧)
1.創建stack對象
?2.?入棧(先進后出)
3.出棧
?擴展:舉個例子:實現下字符串逆置,利用stack棧來實現。
從接口實現上,ArrayList與Vector都是基于動態數組實現的List接口的集合實現類。
?擴容機制
ArrayList擴容源碼
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);
- 當傳入的是無參構造時候,add(11)個元素時候,會進行擴容,新容量為oldCapacity>>1+oldCapacity;
- 當傳入的是帶參構造,擴容時候,會按照它的傳入的擴容容量+擴容容量<<1進行計算;
Vector擴容源碼
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);
}
-
Vector 的無參構造,數組的初始化容量為10,每次擴容不足,擴容為原來的二倍
-
初始化提供數組的初始化容量和每次的擴容值,當容量不足時候,已指定擴容值進行擴容操作
二者區別
初始容量:
- ArrayList初始默認容量為0,添加一個元素時候,擴容為10;
- Vector 初始容量為10;
擴容方式:
- ArrayList:在原有容量基礎上,擴容1.5倍。
- Vector:在原有容量基礎上,擴容2倍。
線程安全:
- ArrayList:線程不安全(可使用CopyWriteArrayList集合解決)
- Vector:線程安全,操作方法使用sychronized(同步鎖)實現線程同步。
執行效率:
- Vector的方法加入了同步鎖,實現線程安全,所以在方法執行時許加鎖,釋放鎖,產生額外的性能開銷,所以Vector性能會低于ArrayList.
// 棧 先進后出Stack<String> stack = new Stack<>();// 入棧stack.push("張三");stack.push("李四");stack.push("王五");System.out.println(stack);// 獲取到棧頂元素,并讓棧頂元素出棧// String item = S1.POP();// 獲取棧頂元素,元素不出棧。String item = stack.peek();System.out.println(item);System.out.println(stack);// 字符串逆置System.out.println(reverse("abcdefg"));}public static String reverse(String str){Stack<Character> stack = new Stack<>();// 字符串中的元素入棧char[] c1 = str.toCharArray();for (char c : c1){stack.push(c);}StringBuilder sb = new StringBuilder();// 出棧while (!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}
擴展:stack(棧)
1.創建stack對象
Stack<Character> stack = new Stack<>();
?2.?入棧(先進后出)
?
? ? ? ? stack.push("張三");
3.出棧
// 獲取到棧頂元素,并讓棧頂元素出棧// String item = S1.pop();
// 獲取棧頂元素,元素不出棧。String item = stack.peek();
?擴展:舉個例子:實現下字符串逆置,利用stack棧來實現。
public static String reverse(String str){Stack<Character> stack = new Stack<>();// 字符串中的元素入棧char[] c1 = str.toCharArray();for (char c : c1){stack.push(c);}StringBuilder sb = new StringBuilder();// 出棧while (!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}