JAVA:ArrayList常用方法+底層原始碼分析
阿新 • • 發佈:2018-12-07
Arraylist特點:動態開闢,初始容量為10,只能放引用資料型別
ArrayList<Integer> arrayList=new ArrayList<Integer>();
Arraylist增加元素,自增擴容方式1.5倍,Arrays.copyof()拷貝 可以放重複值,可以放多個null值
arrayList.add(12); arrayList.add(15); arrayList.add(1); arrayList.add(null); arrayList.add(null); arrayList.add(12);
原始碼對於增加元素擴容方式:
拷貝方式Array.copyof()
private void grow(int minCapacity) { // overflow-conscious code int 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); }
Arrays.copyof() 與System.arraycopy()的區別:
Arrays.copyof()底層呼叫的是System.arraycopy()
System.arraycopy()
public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { @SuppressWarnings("unchecked") T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy;
/**三種遍歷方式: * 1.for迴圈 * 2.增強for迴圈 * 3.迭代器:有hashnext(),next()兩個方法 */
System.out.println("for迴圈");
//size()計算arrayList中存放元素的個數
for(int i=0;i<arrayList.size();i++){
//通過索引獲取元素
System.out.println(arrayList.get(i));
}
System.out.println("增強for迴圈");
for (Integer value:arrayList) {
System.out.println(value);
}
System.out.println("迭代器");
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
/** * 增刪改查效率問題: * 增加:add() * 刪:remove * 查:get() * 查詢效率高 * */
ArrayList與陣列的區別:
1.儲存資料:ArrayList只能儲存引用資料型別,陣列既可以存放引用資料型別也可以存放基本資料型別
2.初始化與擴容方式:
ArrayList預設初始容量為10,動態開闢,擴容方式為1.5倍,應用grow()方法,
陣列必須自己定義容量大小,沒有動態開闢,擴容需要自己手動擴容
3.遍歷方式:
陣列與ArrayList都可以用索引遍歷,使用for迴圈和增強for迴圈,而ArrayList底層實現iterator()介面,可以通過迭代器遍歷,應用hasNext()和Next()方法。