O Arraylist subjacente mantém uma matriz dinâmica e cada instância do Arraylist tem uma capacidade. Essa capacidade refere -se ao tamanho da matriz usada para armazenar elementos da lista. É sempre pelo menos igual ao tamanho da lista. À medida que os elementos são constantemente adicionados à lista de Array, sua capacidade também aumenta automaticamente.
O ArrayList não é síncrono (ou seja, não é seguro para threads). Se vários threads acessarem uma instância do Arraylist ao mesmo tempo e pelo menos um dos threads modificar estruturalmente a lista, ele deve manter a sincronização externa. Em um ambiente multithread, um Arraylist seguro para roscas pode ser declarado usando as coleções.
List ArrayList = Coleções.synchronizedList (new ArrayList ());
A seguir, é apresentado o código -fonte da ArrayList para analisar seu princípio.
1. Método de construção do Arraylist: Arraylist fornece três métodos de construção diferentes
1) ArrayList (), construa uma lista vazia com uma capacidade inicial de 10.
2) Arraylist (int InitialCapacity), construindo uma lista vazia com uma capacidade inicial especificada.
3) ArrayList (coleção <? Extende e> c), constrói uma lista de elementos que contêm a coleção especificada, que estão dispostos na ordem em que o iterador da coleção os retorna.
O código -fonte é o seguinte:
objeto transitório privado [] elementData; public ArrayList (int InitialCapacity) {super (); if (InitialCapacity <0) lançar novas ilegalargumentException ("Capacidade ilegal:"+ InitialCapacidade); this.ElementData = novo objeto [InitialCapacity]; // Gere uma matriz de objeto tipo de comprimento 10} public ArrayList () {this (10); // Call ArrayList (int i)} <br> <br> public ArrayList (coleção <? Extende e> c) {elementData = c.toArray (); // retorna uma matriz contendo todos os elementos nesta coleção Tamanho = elementData.length; // c.toArray pode (incorretamente) não retornar objeto [] (consulte 6260652) if (elementData.getClass ()! = Object []. Class) elementData = Arrays.copyof (elementData, tamanho, objeto []. classe); // Copie a matriz especificada e retorne uma matriz do tipo de objeto que contém o mesmo elemento e comprimento} Ao usar o ArrayList () para gerar um objeto de coleta sem parâmetros, o construtor ArrayList (int InitialCapacity) é chamado na parte inferior para produzir uma matriz de tipo de objeto com comprimento 10. Ao usar um construtor com parâmetros de tipo de conjunto, uma matriz do tipo de objeto que contém os mesmos elementos e o comprimento é gerada na parte inferior.
2. Adicionar método: o ArrayList fornece dois métodos de adição para adicionar elementos
1) Adicione (e E), adicione o elemento especificado ao final desta lista.
2) Adicionar (índice int, e e), insira o elemento especificado na posição especificada nesta lista. Mova a direita o elemento atualmente nessa posição (se houver) e todos os elementos subsequentes (indexados por 1) tamanho privado int;
public boolean add (e e) {surCapacity (tamanho + 1); // expanda a capacidade de matriz elementData [size ++] = e; // Adicione o elemento E à matriz de objeto com tamanho de subscrito e execute o tamanho ++ retorna true; } public void add (int Índice, e elemento) {if (índice> size || índice <0) // Se o subscrito de matriz especificado a ser inserido exceder a capacidade da matriz ou o subcrato especificado for menor que 0, jogue uma exceção, lançar o novo indexOutOfBoundSception ("Índice:"+índice+", tamanho:"+tamanho); segurança (tamanho+1); // expandir o sistema de capacidade de matriz.arraycopy (elementData, índice, elementData, índice + 1, tamanho - índice); // Copie uma matriz da matriz de origem especificada e a cópia começa da posição especificada para a posição especificada da matriz de destino. <br> // ElementData --- Índice de matriz de origem --- Iniciar a posição na matriz de origem <br> // elementData --- índice de matriz de destino+1 --- Posição inicial na matriz de destino <br> // tamanho-Índice --- Número de elementos da matriz a ser copiado ElementData [índice] = elemento; // Coloque o elemento a ser adicionado no tamanho do índice de matriz especificado ++; } public void eguraCapacity (int mincapacity) {modCount ++; int OldCapacity = ElementData.Length; // a capacidade da matriz original if (mincapacity> OldCapacity) {objeto antigoData [] = elementData; int newCapacity = (OldCapacity * 3)/2 + 1; // Defina a capacidade da nova matriz, que é 1,5 vezes a capacidade da matriz original +1 if (newcapacity <mincapacity) newCapacity = MinCapacity; // MinCapacity geralmente é próximo do tamanho, então isso é uma vitória: elementData = Arrays.copyof (ElementData, NewCapacity); // Copie a matriz especificada e retorne a capacidade da nova matriz como NewCapacity}} Se mais de 10 elementos forem adicionados na coleção, a camada inferior do Arraylist gerará uma nova matriz com um comprimento de 1,5 vezes + 1 da matriz original e copiará os elementos na matriz original na nova matriz e os elementos adicionados subsequentes serão colocados na nova matriz. Esse processo é repetido quando o comprimento da nova matriz não pode acomodar os elementos recém -adicionados. Este é o princípio da implementação de adicionar elementos a uma coleção.
3. Obtenha o método:
1) GET (índice int), retorne o elemento na posição especificada nesta lista.
public e get (int index) {rangecheck (index); // Verifique se o índice especificado foi aprovado é o retorno legal (e) elementData [index]; // Retorna o elemento da matriz com o índice de subscrito da matriz} private void Rangecheck (int index) {if (index> = size) // Se o subscrito de entrada for maior ou igual à capacidade do conjunto, jogue uma exceção em novo indexOutOfBoundSception ("índice:"+índice+", tamanho:"+tamanho); } 4. Remova o método:
1) e remover (índice int), remova o elemento na posição especificada nesta lista. Mova todos os elementos subsequentes para a esquerda (diminuição do índice em 1).
2) Remover booleano (objeto O), remova o elemento especificado que aparece pela primeira vez nesta lista (se presente). Se a lista não contiver esse elemento, a lista não será alterada e o valor booleano será retornado.
public e Remover (Int Index) {Rangecheck (índice); // Verifique se o índice especificado é ModCount ++ legal; E OldValue = (e) elementData [index]; // Obtenha o elemento de matriz do índice especificado int numMoved = size - Índice - 1; // o número de elementos a serem movidos se (numMoved> 0) System.ArrayCopy (ElementData, Index+1, ElementData, Index, numMoved); // mova o elemento de matriz elementoData [-size] = null; // Deixe o GC fazer seu trabalho retornar OldValue; } public boolean Remover (objeto o) {if (o == null) {// Se o parâmetro passado for nulo para (int index = 0; index <size; index ++) if (elementData [index] == null) {// remova a primeira ocorrência do null fastremove (índice); retornar true; }} else {for (int index = 0; index <size; index ++) if (o.equals (elementData [index])) {fastremove (index); retornar true; }} retornar false; } private void Fastremove (int index) {// Remover o elemento na posição especificada, o método de implementação é semelhante ao remover (int i) modCount ++; int numMoved = size - índice - 1; if (numMoved> 0) System.arrayCopy (ElementData, Index+1, ElementData, Index, numMoved); elementData [-size] = null; // Deixe o GC fazer seu trabalho} 5. Método do clone:
1) Clone do objeto (), retorna uma cópia superficial desta instância do Arraylist (sem copiar esses próprios elementos).
public Object clone () {try {ArrayList <E> v = (ArrayList <E>) super.clone (); // calculando o método clone da classe de objeto para retornar um objeto Arraylist v.ElementData = Arrays.copyof (elementData, size); // copie a matriz de destino v.modCount = 0; retornar v; } catch (clonenotsupportEdException e) {// Isso não deve acontecer, já que somos clonáveis lançando new internalError (); }} A análise acima de alguns códigos de origem chave do ArrayList, conhecemos o princípio de implementação subjacente do ArrayList. Existem os seguintes pontos e pontos para o código -fonte da Arraylist:
1) A camada subjacente do Arraylist é implementada com base em matrizes, e o elemento de destino pode ser encontrado com precisão através dos seguintes padrões, portanto a eficiência da pesquisa é alta; No entanto, adicionar ou excluir elementos envolverá o movimento de posição de um grande número de elementos, o que é ineficiente.
2) Arraylist fornece três métodos de construção diferentes. O método de construção sem parâmetros gera uma matriz do tipo de objeto com comprimento de 10 por padrão na camada inferior. Quando o número de elementos adicionados no conjunto é maior que 10, a matriz se expande automaticamente, ou seja, gerar uma nova matriz e colocar os elementos da matriz original na nova matriz.
3) O método de segurança expande a matriz, que gerará uma nova matriz com um comprimento de 1,5 vezes + 1 da matriz original. Como os elementos são constantemente adicionados à lista de Array, repita o processo quando o comprimento da matriz não puder atender às necessidades.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.