Este artigo estuda principalmente o conteúdo relacionado dos exemplos de problemas de expansão da Arraylist Java, como segue.
Primeiro de tudo, precisamos saber que a essência do Arraylist é na verdade uma matriz do tipo objetos. O problema de expansão da Arraylist é na verdade o problema de expansão dessa matriz do tipo objetos.
objeto transitório [] elementData;
Existem três situações para criar um Arraylist
Arraylist al = new ArrayList ();
Após a conclusão da criação, a capacidade de Al é 0. Você pode saber do código a seguir.
objeto transitório [] elementData; Objeto final estático privado [] defaultCapacity_empty_elementData = {}; public ArrayList () {this.ElementData = defaultCapacity_empty_elementData;}Arraylist al = new ArrayList (5);
Criar um objeto Arraylist com uma capacidade de 5 é na verdade uma matriz de objetos com um comprimento de 5. Você pode saber do código a seguir.
objeto transitório [] elementData; Objeto final estático privado [] defaultCapacity_empty_elementData = {}; public ArrayList (int InitialCapacity) {if (InitialCapacity> 0) {this.ElementData = novo objeto [InitialCapacity]; } else if (InitialCapacity == 0) {this.ElementData = vazio_ElementData; } else {lança nova ilegalArgumentException ("Capacidade ilegal:"+ InitialCapacidade); }}Arraylist al = novo ArrayList <TEGER> (Arrays.asList (1, 2, 3, 4, 5));
O objeto Arraylist é criado acima e inicializado usando uma lista como [1,2,3,4,5]. De fato, cria uma matriz de objetos de comprimento 5, e o conteúdo da matriz é [1, 2, 3, 4, 5]. Você pode saber do código a seguir.
Tamanho INT privado; objeto transitório [] elementData; objeto final estático privado [] defaultCapacity_empty_elementData = {}; public ArrayList (coleção <? Extende e> c) {elementData = c.toarray (); if ((size = elementData.length)! = 0) {// c.toArray pode (incorretamente) não retornar objeto [] (consulte 6260652) if (elementData.getclass ()! = objeto []. Class) elementData = Arrays.copy de (elementData, tamanho, objeto []. Classe); } else {// substitua por matriz vazia. this.ElementData = emaillement_elementData; }} ArrayList <Teger> collection = new ArrayList <TEGER> (Arrays.asList (1, 2, 3, 4, 5)); Inteiro [] MoreInts = {6, 7, 8, 9, 10}; collection.addall (Arrays.asList (MoreInts)); 1. Crie uma lista de Array com tamanho 5, com conteúdo [1, 2, 3, 4, 5]. - A capacidade inicial é 5
2. Adicione o conjunto {6, 7, 8, 9, 10} a este objeto Arraylist. ---- Neste momento, a capacidade desse objeto Arraylist precisa ser expandida.
public boolean addall (coleção <? estende e> c) {// Obtenha o objeto de matriz de inserção [] a = c.toarray (); // Obtenha o comprimento do conteúdo de inserção int numNew = a.Length; surCapacityIntrNalN (size + numNew); // increments ModCountSystem.arrayCopy (a, 0 elemento, elemento + 0;} vazio privado EnsureCapacityInternal (int mincapacity) {// Se o conteúdo no ArrayList estiver vazio if (elementData == defaultCapacity_empty_elementData) {miCapacity = Math.Max (default_capacity, minapacity);} assegure explicacity (MinMax (MinMax (MINMAX (MINMAX (MINMAX (MINMAX (MININCAPACIDADE (MinCaPacity (MinCapacity (MathCapacity (MathCapacity (MathCapacity (MinMax (Default_Capacity, MINCAPACIDADE); MinCapacity) {modCount ++; // calcula ainda mais o tamanho de tamanho expandido (MinCapacity - ElementData.Length> 0) Grow (MinCapacity);} Void privado Grow (int MinCapacity) {// O tamanho original do ArrayList Int AntdCapacity = ElementData.Lingning; int newCapacity = OldCapacity + (OldCapacity >> 1); // Compare com o comprimento da expansão calculado anteriormente, pegue o maior como o comprimento da expansão se (newcapacity - MinCapacity <0) newCapacity = MinCapacity; // Se a expansão é maior que o máximo, se (newCapacity - maixin: main -maix MAIX; hugeCapacity(minCapacity);// Expansion elementData = Arrays.copyOf(elementData, newCapacity);}private static int hugeCapacity(int minCapacity) {// minCapacity is less than 0, indicating overflow, otherwise the maximum integer is used as the final expansion length if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (Mincapacity> max_array_size)? Integer.max_value: max_array_size;} 1. O tamanho original da Arraylist + do tamanho da coleção a ser inserida numNew = obtenha o comprimento mínimo da pinçapacia de Arraylist expandida
2. Se o tamanho original da Arraylist for 0, ou seja, a lista de Arrays está vazia, o comprimento mínimo da lista de Array após a expansão Mincapacity = Math.Max (10, MinCapacity), ou seja, o comprimento mínimo da renda de expansão.
3. A capacidade de comprimento mínimo expandida obtida acima não é o comprimento expandido final e é necessário um cálculo adicional.
(1) Obtenha o tamanho original da Antiga Capacidade Arraylist
(2) obtenha o novo tamanho expandido: newcapacity = OldCapacity*1.5;
(3) Compare a montagem de comprimento mínimo expandida calculada acima com o tamanho expandido Newcapacity obtido aqui e pegue o maior como o tamanho final expandido.
O exposto acima é toda a explicação detalhada do exemplo do problema de expansão da Arraylist neste artigo, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!