Diferença entre ArrayList e Vector em java
ArrayList e Vector ambos usam Array como uma estrutura de dados internamente. No entanto, existem poucas diferenças na forma como armazenam e processam os dados. Neste post vamos discutir a diferença e semelhanças entre ArrayList e Vector.
ArrayList Vs Vector:
1) sincronização: ArrayList is non-synchronized which means multiple threads can work on ArrayList at the same time. = = Ligações externas = = se um thread está realizando uma operação de adição no ArrayList, pode haver um outro thread executando a operação de remoção no ArrayList ao mesmo tempo em um ambiente multithreaded
enquanto o Vector está sincronizado. Isto significa que se um fio está trabalhando no vetor, nenhum outro fio pode obter um controle dele. Ao contrário do ArrayList, apenas um fio pode executar uma operação em vetor de cada vez.
2) redimensionar: tanto o ArrayList como o Vector podem crescer e encolher dinamicamente para manter o uso ideal do armazenamento, no entanto, a forma como eles redimensionaram é diferente. O ArrayList cresce por metade de seu tamanho quando redimensionado enquanto o Vector duplica o tamanho de si mesmo por padrão quando cresce.
3) desempenho: ArrayList dá melhor desempenho como ele é não-sincronizado. Operações vetoriais dão má performance como eles são thread-safe, o thread que funciona no Vector tem uma fechadura nele que faz com que outro thread espere até que o bloqueio é liberado.
4) fail-fast: Primeiro deixe-me explicar o que é fail-fast: Se a coleção (ArrayList, vector etc) é estruturalmente modificada por qualquer meio, exceto os métodos de adicionar ou remover iterator, após a criação do iterator, então o iterator irá lançar ConcurrentModificationException
. Modificação estrutural refere-se à adição ou eliminação de elementos da coleção.
de acordo com o Javadoc Vetor, a enumeração retornada pelo vetor não é rápida. Do outro lado, o iterador e o listiterador retornados pelo ArrayList são muito rápidos.
5) Quem pertence realmente ao quadro de recolha? O vetor não era parte do framework de coleta, ele foi incluído em coleções mais tarde. Pode ser considerado como um código legado. Não há nada sobre vetor que a coleção de listas não pode fazer. Por conseguinte, o Vector deve ser evitado. Se houver uma necessidade de operação thread-safe fazer ArrayList sincronizado como discutido na próxima seção deste post ou usar CopyOnWriteArrayList que é uma variante thread-safe de ArrayList.
existem poucas semelhanças entre estas classes, que são as seguintes::
- ambos vetores e ArrayList usam estrutura de dados array growable.
- o iterador e o listiterador retornados por estas classes (vetor e ArrayList) são fail-fast.
- ambos são classes de coleção ordenadas, uma vez que mantêm a ordem de inserção de elementos.
- Vector & ArrayList ambos permite valores duplicados e nulos.
- ambos crescem e encolhem automaticamente quando o excesso e a exclusão acontece.
quando utilizar o ArrayList e quando usar o vector?
depende totalmente da exigência. Se houver uma necessidade de realizar a operação “thread-safe” O vetor é a sua melhor aposta, pois garante que apenas um thread acessar a coleção de cada vez.
Performance: as operações sincronizadas consomem mais tempo em comparação com as não sincronizadas de modo que, se não houver necessidade de operação segura de thread, ArrayList é uma melhor escolha, pois o desempenho será melhorado por causa dos processos concorrentes.
como sincronizar o ArrayList?
como eu disse acima os métodos de ArrayList são não-sincronizados, mas ainda se houver uma necessidade você pode fazê-los sincronizados como este –
//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}