ArrayList de 0 a 1

ArrayList es en realidad una matriz con longitud variable. Inicialmente, es una matriz vacía. Cuando se agrega el primer elemento, la capacidad de la matriz se convierte en 10.
La complejidad de tiempo de insertar y eliminar elementos es O (n). Encuentre la longitud de la tabla y agregue elementos. La complejidad temporal de tomar el elemento i-ésimo es O (1)

1. Estructura de datos ArrayList

//使用一个Object数组进行存储
 transient Object[] elementData;
 //数组元素的大小
 private int size;

Método 2.add

1. Agregar método sin subíndice especificado

El siguiente código fuente de JDK

	//增加方法
   public boolean add(E e) {
    
    
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    //检查是否要扩容
    private void ensureCapacityInternal(int minCapacity) {
    
    
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    //得到最小扩容量
  	private static int calculateCapacity(Object[] elementData, int minCapacity) {
    
    
  		//返回默认容量和当前容器加1的最大值
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
    
    
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }
    //判断是否需要扩容
	 private void ensureExplicitCapacity(int minCapacity) {
    
    
        modCount++;
        //容量超出即扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    //扩容
   private void grow(int minCapacity) {
    
    
   		//保存旧容量
        int oldCapacity = elementData.length;
        //新容量为旧容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //新容量是否小于最小需要容量
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
         //新容量是否超出了ArrayList所定义的最大容量
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
          //拷贝,ArrayscopyOf()继续调用System的arraycopy
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

Resumen:
1. Primero juzgue si expandir y luego asigne un valor
2. Expandir a 1.5 veces la matriz original
3. Usar el método de copia del sistema

2. Especifique el método de adición del subíndice

   public void add(int index, E element) {
    
    
       //检查下标是否越界
        rangeCheckForAdd(index);
        //判断是否要扩容
        ensureCapacityInternal(size + 1);  
        //让index开始之后的所有成员后移一个位置:
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

El método de eliminación es similar al método de obtención, excepto que el elemento se elimina y se mueve hacia la izquierda.

Supongo que te gusta

Origin blog.csdn.net/weixin_40791454/article/details/107040140
Recomendado
Clasificación