Comprensión simple del código fuente de ArrayList

ArrayList en Java Collection Framework

1. ArrayList se expande dinámicamente, cada expansión es 1,5 veces la longitud original y se adopta una estrategia de carga diferida. Cuando se llama al método add por primera vez, la matriz se expandirá a 10 (valor predeterminado)

2. Implementación de la simulación

Interfaz de lista:

public interface List<E> {
    
    

    int size();

    void add(E e);

    E get(int index);

    E set(int index, E e);

    boolean remove(int index);

}

MyArrayList, que implemento yo mismo, inicializa el tamaño de la matriz a 10 en el método de construcción, y el tamaño se expande a 10 cuando se llama a add () por primera vez en el código fuente (el código fuente es una matriz con una longitud predeterminada de 0 definida por la referencia de matriz en el método de construcción);

public class MyArrayList<E> implements List<E> {
    
    

    private static final int DEFAULT_CAPACITY = 10;
    private Object[] elementData;
    private int size;

    public MyArrayList() {
    
    
        elementData = new Object[DEFAULT_CAPACITY];
    }

    @Override
    public int size() {
    
    
        return size;
    }

    @Override
    public void add(E e) {
    
    
        ensureCapacity(size + 1);
        elementData[size++] = e;
    }

    @Override
    public E get(int index) {
    
    
        rangeCheck(index);
        return elementData(index);
    }

    @Override
    public E set(int index, E e) {
    
    
        rangeCheck(index);
        E oldValue = elementData(index);
        elementData[index] = e;
        return oldValue;
    }

    @Override
    public boolean remove(int index) {
    
    
        rangeCheck(index);

        /*for (int i = index + 1; i < size; i++) {
            elementData[i - 1] = elementData[i];
        }*/


        System.arraycopy(elementData,index+1,elementData,index,size-index-1);

        elementData[--size] = null;

        return true;
    }

    //动态扩容
    private void ensureCapacity(int minCap) {
    
    
        if (minCap - elementData.length > 0) {
    
    
            group(minCap);
        }
    }

    private void group(int minCap) {
    
    
        int oldCap = elementData.length;
        int newCap = oldCap + (oldCap >> 1);

        if (newCap - minCap < 0) {
    
    
            newCap = minCap;
        }
        if (newCap - (Integer.MAX_VALUE - 8) > 0) {
    
    
            throw new IllegalArgumentException("长度超出");
        }

        elementData = Arrays.copyOf(elementData, newCap);

    }

    //检查下标是否越界
    private void rangeCheck(int index) {
    
    
        if (index >= size) {
    
    
            throw new IndexOutOfBoundsException("下标越界");
        }
    }

    //将Object类型的元素转为E
    @SuppressWarnings("unchecked")
    private E elementData(int index) {
    
    
        return (E) elementData[index];
    }

    @Override
    public String toString() {
    
    
        Object[] res = Arrays.copyOf(elementData,size);
        return Arrays.toString(res);
    }
}

prueba

public class Test {
    
    
    public static void main(String[] args) {
    
    
        MyArrayList<Integer> list = new MyArrayList<>();

        list.add(1);
        list.add(2);
        list.add(3);

        list.add(1);
        list.add(2);
        list.add(3);

        list.add(1);
        list.add(2);
        list.add(3);

        list.add(1);
        list.add(2);
        list.add(3);

        System.out.println(list);//[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
        System.out.println(list.get(0));//1
        System.out.println(list.size());//12
        list.set(10,0);
        System.out.println(list);//[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 0, 3]
        list.remove(11);
        System.out.println(list.size());//11
        System.out.println(list);//[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 0]

    }

}

Supongo que te gusta

Origin blog.csdn.net/Beer_xiaocai/article/details/104902028
Recomendado
Clasificación