Diferenças entre edições de "Java/ArrayList"

509 bytes adicionados ,  22h32min de 27 de junho de 2016
sem resumo de edição
A classe <code>ArrayList</code> é uma implementação da interface <code>List</code> que utiliza um [[Java/Vetores|vetor]] para armazenar elementos. Uma vez que vetores tem tamanho fixo em Java, a classe <code>ArrayList</code> se encarrega de criar um novo vetor (internamente) com um tamanho maior e copiar seus elementos correntes para esse novo vetor sempre que for necessário.
 
O vetor interno da classe <code>ArrayList</code> é recriado quando há remoções de elemento, adições de elemento no fim da lista além da capacidade dimensionada e adições de elementos que não no final da lista.
 
Como a operação de recriação do vetor é custosa, busque dimensionar previamente o tamanho da lista, para tal, utilize o construtor sobrecarregado <code>ArrayList(int)</code> enviando como argumento a capacidade inicial da lista. A capacidade inicial padrão de um objeto <code>ArrayList</code> é de 10 elementos.
 
== Performance ==
}
</source>
'''Saída'''
Lista Original [Google Chrome, Mozilla Firefox, Microsoft Internet Explorer]
Lista Clonada [Google Chrome, Mozilla Firefox, Microsoft Internet Explorer]
Lista Clonada [Google Chrome, Microsoft Edge]
 
Foi utilizado o construtor sobrecarregado '''<code>ArrayList<>(int)'''</code> para definir a capacidade inicial do vetor interno. Não confunda a capacidade inicial do vetor com o tamanho da Lista. O tamanho é devolvido pelo método <code>size()</code> e corresponde à quantidade de elementos armazenados já a capacidade é o tamanho do vetor interno o qual não temos acesso.
 
O método '''<code>ensureCapacity(int)'''</code> recriou o vetor interno com o capacidade para 15 elementos.
 
O método '''<code>trimToSize(int)'''</code> recriou novamente o vetor interno, porém agora com a capacidade igual ao tamanho da lista, no caso 3.
 
O método '''<code>clone()'''</code>, sobrescrito de <code>[[java/Object | Object]]</code> e indicado pela implementação da interface <code>[[java/Clonable | Clonable]]</code>, atribuiu uma instância de <code>ArrayList</code> à variável <code>listaClone</code> com os mesmos elementos, que são as referências às 3 instâncias do objeto <code>NavegadorWeb</code> que incluímos na variável <code>listaOriginal</code>. Como o método <code>clone()</code> devolve um tipo <code>Object</code>, foi necessário o uso do ''cast'' com o tipo <span class="br0"code>(</span>ArrayList<span class="sy0"Navegador><)</spancode>NavegadorWeb<span class="sy0">></span><span class="br0">). Conforme evidenciado na chamada do método <code>setNome("Edge")</code> o método <code>clone()</code> apenas copia a lista e não cada um de seus elementos e com a chamada ao método <code>remove(1)</code> percebemos que as instâncias de <code>ArrayList</code> nas variáveis <code>listaOriginal</code> e <code>listaClone</code> são diferentes e portanto desvinculadas.</span>
 
Como você pode ter concluído, o uso dos métodos <code>ensureCapacity(int)</code> e <code>trimToSize(int)</code> não é recomendável pois eleeles recriarecriam o vetor interno do objeto <code>ArrayList</code> osituação em que prejudica a performance é prejudicada.
 
= Exercício =
# Depure o código acima e observe em que chamadas de métodos o atributo elementData é alterado.
# Os métodos <code>add()</code> e <code>remove()</code> alteram a capacidade da instância de <code>ArrayList</code> das variáveis <code>listaOriginal</code> e <code>listaClone</code>?