1. 程式人生 > >JAVA:ArrayList常用方法+底層原始碼分析

JAVA:ArrayList常用方法+底層原始碼分析

 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()方法。