Este artículo estudia principalmente los contenidos relacionados de los ejemplos de problemas de expansión de la lista de matrices Java, de la siguiente manera.
En primer lugar, necesitamos saber que la esencia de ArrayList es en realidad una matriz de tipo objeto. El problema de expansión de ArrayList es en realidad el problema de expansión de esta matriz de tipo de objeto.
objeto transitorio [] elementData;
Hay tres situaciones para crear una lista de matrices
ArrayList al = new ArrayList ();
Después de completar la creación, la capacidad de AL es 0. Puede saber por el siguiente código.
objeto transitorio [] elementData; objeto final estático privado [] defaultCapacity_empty_elementData = {}; public arrayList () {this.ElementData = defaultCapacity_Empty_elementData;}ArrayList al = new ArrayList (5);
Crear un objeto ArrayList con una capacidad de 5 es en realidad una matriz de objetos con una longitud de 5. Puede saber desde el siguiente código.
objeto transitorio [] elementData; Objeto final estático privado [] defaultCapacity_Empty_ElementData = {}; public ArrayList (int InitialCapacity) {if (InicialCapacity> 0) {this.ElementData = new Object [InicialCapacity]; } else if (inicialCapacity == 0) {this.elementData = vacía_elementData; } else {tirar nueva ilegalArgumentException ("Capacidad ilegal:"+ InicialCapacity); }}ArrayList al = new ArrayList <integer> (arrays.aslist (1, 2, 3, 4, 5));
El objeto ArrayList se crea arriba e inicializado utilizando una lista como [1,2,3,4,5]. De hecho, crea una matriz de objetos de longitud 5, y el contenido de la matriz es [1, 2, 3, 4, 5]. Puede saber por el siguiente código.
Tamaño privado int; objeto transitorio [] elementData; Objeto final estático privado [] defaultCapacity_Empty_elementData = {}; public arrayList (colección <? extiende e> c) {elementData = c.toarray (); if ((size = elementData.length)! = 0) {// C.ToArray podría (incorrectamente) no devolver objeto [] (ver 6260652) if (elementData.getClass ()! = Object []. Class) ElementData = Arrays.CopyOf (ElementData, Size, Object []. Class); } else {// Reemplazar con una matriz vacía. this.ElementData = vacía_elementData; }} ArrayList <Integer> colección = new ArrayList <Integer> (Arrays.aslist (1, 2, 3, 4, 5)); Integer [] MoreInts = {6, 7, 8, 9, 10}; Collection.addall (Arrays.aslist (Moreints)); 1. Cree una lista de matrices con tamaño 5, con contenido [1, 2, 3, 4, 5]. - La capacidad inicial es 5
2. Agregue el conjunto {6, 7, 8, 9, 10} a este objeto ArrayList. "En este momento, la capacidad de este objeto ArrayList debe ampliarse.
public boolean addall (Collection <? Extends e> c) {// Obtener el objeto de matriz Insertar [] a = c.toarray (); // Obtener la longitud de contenido inserto int numNew = a.length; asurecapacityInternal (size + numNew); // incrementa modcountsystem.arrayCopy (a, 0, elementData, size); size + = numNew; numnew; void asurecapacityInternal (int mincapacity) {// Si el contenido en ArrayList está vacío if (elementData == defaultCapacity_Empty_elementData) {mincapacity = math.max (default_capacity, mincapacity);} asegurar unoscapacidad (mincapacity);} private void void void voidcitCapacity (int mincapacity);} garantizarcapacidad (mincapacity);} {ModCount ++; // Calcule aún más el tamaño expandido MinCapacityIF (minCapacity - ElementData.Length> 0) Grow (MinCapacity);} private void grow (int mincapacity) {// El tamaño original de ArrayList int OldCapacity + (OldCapacity >> 1); // Compare con la longitud de expansión de la expansión MinCapacity previamente calculada, tome el más grande como la longitud de expansión if (NewCapacity - mincapacity <0) newCapacity = mincapacity; // si la longitud de expansión es mayor que la longitud máxima if (newcapacity - max_array_size> 0) newCapacity (mincapacity (mincapacity (mincapacity (mincapacity; Expansión elementData = arrays.copyOf (elementData, newCapacity);} private static int hugeCapacity (int mincapacity) {// mincapacity es menor que 0, lo que indica el desbordamiento, de lo contrario el entero máximo se usa como la longitud de expansión final si (mincapacidad <0) // overlowthrow New OutfMemoryerRor (); Max_array_size)? Integer.max_value: max_array_size;} 1. El tamaño original de ArrayList + el tamaño de la colección que se insertará numNew = Obtenga la longitud mínima de la mincapacidad expandida ArrayList
2. Si el tamaño original de ArrayList es 0, es decir, ArrayList está vacía, la longitud mínima de ArrayList después de la expansión mincapacidad = Math.Max (10, Mincapacity), es decir, la longitud mínima de la mincapacidad de expansión no es solo el tamaño de longitud original más el número de longitud del conjunto de la inscripción.
3. La mincapacidad de longitud mínima ampliada obtenida anteriormente no es la longitud ampliada final, y se necesita un cálculo adicional.
(1) Obtenga el tamaño original de ArrayList OldCapacity
(2) Obtenga el nuevo tamaño expandido: NewCapacity = OldCapacity*1.5;
(3) Compare la mincapacidad de longitud mínima expandida calculada anteriormente con la nueva capacidad de tamaño expandido obtenido aquí, y tome el más grande como el tamaño ampliado final.
Lo anterior es toda la explicación detallada del ejemplo del problema de expansión ArrayList En este artículo, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!