La ArrayList subyacente mantiene una matriz dinámica, y cada instancia de ArrayList tiene una capacidad. Esta capacidad se refiere al tamaño de la matriz utilizada para almacenar elementos de la lista. Siempre es al menos igual al tamaño de la lista. A medida que los elementos se agregan constantemente a ArrayList, su capacidad también aumenta automáticamente.
ArrayList no es sincrónico (es decir, no a prueba de hilo). Si múltiples hilos acceden a una instancia de ArrayList al mismo tiempo, y al menos uno de los hilos modifica estructuralmente la lista, debe mantener la sincronización externa. En un entorno de múltiples subprocesos, se puede declarar una ArrayList segura a hilo utilizando la colección. SynchronizedList Method, por ejemplo:
List arrayList = collections.synchronizedList (new ArrayList ());
El siguiente es el código fuente de ArrayList para analizar su principio.
1. Método de construcción de ArrayList: ArrayList proporciona tres métodos de construcción diferentes
1) ArrayList (), construya una lista vacía con una capacidad inicial de 10.
2) ArrayList (int InitialCapacity), construyendo una lista vacía con una capacidad inicial especificada.
3) ArrayList (Collection <? Extiende E> C), construye una lista de elementos que contienen la colección especificada, que se organizan en el orden en que los iterador de la colección los devuelven.
El código fuente es el siguiente:
objeto transitorio privado [] elementData; public arrayList (int inicialCapacity) {super (); if (InitialCapacity <0) tirar nueva IllegalArgumentException ("Capacidad ilegal:"+ InicialCapacity); this.ElementData = nuevo objeto [InicialCapacity]; // Generar una matriz del tipo de objeto de longitud 10} public arrayList () {this (10); // Llame ArrayList (int i)} <br> <br> public arrayList (colección <? Extends e> c) {elementData = c.toarray (); // devuelve una matriz que contiene todos los elementos en esta colección tamaño = elementData.length; // C.ToArray podría (incorrectamente) no devolver objeto [] (ver 6260652) if (elementData.getClass ()! = Object []. Class) elementData = Arrays.CopyOf (elementData, size, object []. class); // Copiar la matriz especificada y devolver una matriz del tipo de objeto que contiene el mismo elemento y longitud} Cuando se usa ArrayList () para generar un objeto de recolección sin parámetros, el constructor ArrayList (int InitialCapacity) se llama a la parte inferior para producir una matriz de tipo de objeto con la longitud 10. Cuando se usa un constructor con parámetros de tipo establecido, una matriz de tipo de objeto que contiene los mismos elementos y longitud se genera en la parte inferior.
2. Agregar método: ArrayList proporciona dos métodos de adición para agregar elementos
1) Agregue (e e), agregue el elemento especificado al final de esta lista.
2) Agregar (INT índice, e e), inserte el elemento especificado en la posición especificada en esta lista. Mueva a la derecha el elemento actualmente en esa posición (si lo hay) y todos los elementos posteriores (indexados por 1) tamaño privado int;
public boolean add (e e) {EnsureCapacity (tamaño + 1); // expandir la capacidad de matriz elementData [size ++] = e; // Agregar elemento E a la matriz de objeto con tamaño de subíndice y ejecutar size ++ return treal; } public void add (int index, e elemento) {if (index> size || índice <0) // Si el subíndice de matriz especificado que se insertará excede la capacidad de la matriz o el subíndice especificado es inferior a 0, lanza una excepción nueva indexOutOfBoundsexception ("índice:"+índice+", tamaño:"+tamaño); Ensurecapacidad (tamaño+1); // expandir el sistema de capacidad de matriz. // Copiar una matriz desde la matriz de fuente especificada, y la copia comienza desde la posición especificada hasta la posición especificada de la matriz de destino. <br> // ElementData --- Índice de matriz de origen --- Posición de inicio en la matriz de origen <br> // ElementData --- Índice de matriz de destino+1 --- Posición de inicio en la matriz de destino <br> // tamaño-índice --- Número de elementos de matriz que se copiarán ElementData [index] = elemento; // colocar el elemento a agregar en el tamaño del índice de matriz especificado ++; } public void EnsureCapacity (int mincapacity) {modCount ++; int // La capacidad de la matriz original if (minCapacity> OldCapacity) {Object OldData [] = ElementData; int newCapacity = (OldCapacity * 3)/2 + 1; // Definir la capacidad de la nueva matriz, que es 1.5 veces la capacidad de la matriz original +1 if (newCapacity <mincapacity) newCapacity = mincapacity; // La mincapacidad generalmente está cerca del tamaño, por lo que esta es una victoria: elementData = arrays.copyOf (elementData, newCapacity); // Copiar la matriz especificada y devolver la capacidad de la nueva matriz como NewCapacity}} Si se agregan más de 10 elementos en la colección, la capa inferior ArrayList generará una nueva matriz con una longitud de 1.5 veces + 1 de la matriz original, y copiará los elementos en la matriz original en la nueva matriz, y los elementos adicionales posteriores se colocarán en la nueva matriz. Este proceso se repite cuando la longitud de la nueva matriz no puede acomodar los elementos recién agregados. Este es el principio de implementación de agregar elementos a una colección.
3. Obtener método:
1) Get (int index), devuelva el elemento en la posición especificada en esta lista.
public e get (int index) {rangeCheck (índice); // verifique si el índice especificado aprobado es retorno legal (e) elementData [índice]; // Devuelve el elemento de matriz con el índice de índice de subíndice de matriz} private void rangecheck (int index) {if (index> = size) // Si el subíndice entrante es mayor o igual a la capacidad del conjunto, lanza una excepción nueva indexOutOfBoundsexception ("índice:"+índice+", tamaño:"+tamaño); } 4. Eliminar el método:
1) E Eliminar (índice int), retire el elemento en la posición especificada en esta lista. Mueva todos los elementos posteriores a la izquierda (disminución de su índice en 1).
2) Boolean Eliminar (objeto O), elimine el elemento especificado que aparece por primera vez en esta lista (si está presente). Si la lista no contiene este elemento, la lista no se cambiará y se devolverá el valor booleano.
public e remove (int index) {rangeCheck (índice); // Verifique si el índice especificado es ModCount Legal ++; E OldValue = (E) ElementData [índice]; // Obtener el elemento de matriz del índice especificado int numMoved = size - índice - 1; // El número de elementos que se moverá si (numMoved> 0) System.ArrayCopy (ElementData, índice+1, elementData, index, numMoved); // Mueve el elemento de matriz ElementData [-size] = null; // Deja que GC haga su trabajo devuelve OldValue; } public boolean Remete (Object O) {if (O == NULL) {// Si el parámetro aprobado es nulo para (int index = 0; index <size; index ++) if (elementData [index] == null) {// elimina la primera ocurrencia de fastremove null (index); devolver verdadero; }} else {for (int index = 0; index <size; index ++) if (o.equals (elementData [index])) {fastremove (index); devolver verdadero; }} return false; } private void fastremove (int index) {// Eliminar el elemento en la posición especificada, el método de implementación es similar a eliminar (int i) modcount ++; int numMoved = tamaño - índice - 1; if (numMoved> 0) System.ArrayCopy (ElementData, índice+1, elementData, index, numMoved); elementData [-size] = null; // deja que GC haga su trabajo} 5. Método clon:
1) Object Clone (), devuelve una copia superficial de esta instancia de ArrayList (sin copiar estos elementos por sí mismos).
Public Object clone () {try {ArrayList <E> V = (ArrayList <E>) super.clone (); // Calcular el método clon de la clase de objeto para devolver un objeto ArrayList V.ElementData = Arrays.CopyOf (ElementData, Size); // Copiar la matriz de destino v.modcount = 0; regreso v; } Catch (clonenotsupportedException e) {// Esto no debería suceder, ya que somos clonables lanzar nueva internalSor (); }} El análisis anterior de algunos códigos de origen clave de ArrayList, conocemos el principio de implementación subyacente de ArrayList. Hay los siguientes puntos y puntos para el código fuente de ArrayList:
1) La capa subyacente de ArrayList se implementa en función de las matrices, y el elemento objetivo se puede encontrar con precisión a través de los siguientes estándares, por lo que la eficiencia de búsqueda es alta; Sin embargo, agregar o eliminar elementos implicará el movimiento de posición de una gran cantidad de elementos, lo cual es ineficiente.
2) ArrayList proporciona tres métodos de construcción diferentes. El método de construcción sin parámetros genera una matriz de tipo de objeto con una longitud de 10 por defecto en la capa inferior. Cuando el número de elementos agregados en el conjunto es mayor que 10, la matriz se expandirá automáticamente, es decir, generará una nueva matriz y colocará los elementos de la matriz original en la nueva matriz.
3) El método EnsureCapacity expande la matriz, que generará una nueva matriz con una longitud de 1.5 veces + 1 de la matriz original. A medida que los elementos se agregan constantemente a ArrayList, repita el proceso cuando la longitud de la matriz no pueda satisfacer las necesidades.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.