Quais são as diferenças entre as duas estruturas de dados ArrayList e Vector e onde você deve usar cada uma delas?
Vector v = new Vector(3, 2);
Quais são as diferenças entre as duas estruturas de dados ArrayList e Vector e onde você deve usar cada uma delas?
Vector v = new Vector(3, 2);
Respostas:
Diferenças
Use ArrayLists se não houver um requisito específico para usar Vetores.
Sincronização
Se vários threads acessam um ArrayList simultaneamente, devemos sincronizar externamente o bloco de código que modifica a lista estruturalmente ou simplesmente modifica um elemento. Modificação estrutural significa adição ou exclusão de elemento (s) da lista. Definir o valor de um elemento existente não é uma modificação estrutural.
Collections.synchronizedList
é normalmente usado no momento da criação da lista para evitar qualquer acesso não sincronizado acidental à lista.
Crescimento de dados
Internamente, o ArrayList e o Vector mantêm seu conteúdo usando um Array. Quando um elemento é inserido em um ArrayList ou em Vector, o objeto precisará expandir sua matriz interna se ficar sem espaço. Um Vector padroniza dobrar o tamanho de sua matriz, enquanto o ArrayList aumenta seu tamanho de matriz em 50%.
Como a documentação diz, a Vector
e um ArrayList
são quase equivalentes. A diferença é que o acesso a Vector
é sincronizado, enquanto o acesso a ArrayList
não é. O que isso significa é que apenas um encadeamento pode chamar métodos por Vector
vez e há uma pequena sobrecarga na aquisição do bloqueio; se você usar um ArrayList
, não é esse o caso. Geralmente, você desejará usar um ArrayList
; no caso de rosca única, é uma escolha melhor e, no caso de rosca múltipla, você obtém melhor controle sobre o bloqueio. Deseja permitir leituras simultâneas? Bem. Deseja executar uma sincronização para um lote de dez gravações? Bem também. Exige um pouco mais de cuidado do seu lado, mas provavelmente é o que você deseja. Observe também que, se você tiver um ArrayList, poderá usar oCollections.synchronizedList
para criar uma lista sincronizada, obtendo o equivalente a a Vector
.
Vector
é uma classe interrompida que não é segura para threads, apesar de ser "sincronizada" e usada apenas por estudantes e outros programadores inexperientes.
ArrayList
é a implementação go-to List usada por profissionais e programadores experientes.
Profissionais que desejam uma implementação segura da lista de threads usam a CopyOnWriteArrayList
.
Vector
foi projetado para ser seguro para threads , mas possui uma falha de design que o torna * não seguro para threads . É basicamente uma classe obsoleta. Por alguma razão, as universidades etc. não ouviram falar dessas notícias e ainda defendem seu uso.
ArrayList
é mais recente e 20 a 30% mais rápido.
Se você não precisar de algo explicitamente aparente Vector
, useArrayList
20-30% faster
?
Existem duas grandes diferenciações entre Vector e ArrayList.
O vetor é sincronizado por padrão e o ArrayList não. Nota: você pode tornar o ArrayList também sincronizado, passando o objeto arraylist para o método Collections.synchronizedList (). Meios sincronizados: ele pode ser usado com vários threads sem qualquer efeito colateral.
As ArrayLists crescem 50% do tamanho anterior quando o espaço não é suficiente para o novo elemento, enquanto o Vector cresce 100% do tamanho anterior quando não há espaço para o novo elemento recebido.
Fora isso, existem algumas diferenças práticas entre eles, em termos de esforço de programação:
Quando usar qual?
Nota : mesmo que o arraylist cresça 100%, é possível evitar isso pelo método ensurecapacity () para garantir que você esteja alocando memória suficiente nos próprios estágios iniciais.
Espero que ajude.
ArrayList
e Vector
ambos implementam a interface List e mantém a ordem de inserção. Mas há muitas diferenças entre ArrayList
e Vector
classes ...
ArrayList
não está sincronizado.ArrayList
incrementa 50% do tamanho atual da matriz se o número de elementos exceder sua capacidade.ArrayList
não é uma classe herdada, é introduzida no JDK 1.2.ArrayList
é rápido porque não é sincronizado.ArrayList
usa a interface Iterator para percorrer os elementos.Vetor -
Vector
está sincronizado.Vector
incrementos de 100% significa duplicar o tamanho da matriz se o número total de elementos exceder a sua capacidade.Vector
é uma classe herdada.
Vector
é lento porque está sincronizado, ou seja, no ambiente de multithreading, ele mantém os outros threads no estado executável ou não executável até que o thread atual libere o bloqueio do objeto.
Vector
usa a interface de enumeração para percorrer os elementos. Mas também pode usar o Iterator.
Consulte também: https://www.javatpoint.com/difference-between-arraylist-and-vector
Basicamente, ArrayList e Vector usam a Matriz de objetos interna.
ArrayList: A classe ArrayList estende AbstractList e implementa a interface List e o RandomAccess (interface do marcador). ArrayList suporta matrizes dinâmicas que podem crescer conforme necessário. Ele nos fornece a primeira iteração sobre os elementos. ArrayList usa Array de objeto interno; eles são criados com um tamanho inicial padrão de 10. Quando esse tamanho é excedido, a coleção é automaticamente aumentada para a metade do tamanho padrão que é 15.
Vetor: o vetor é semelhante ao ArrayList, mas as diferenças são: ele é sincronizado e seu tamanho inicial padrão é 10 e quando o tamanho excede o tamanho aumenta para o dobro do tamanho original, o que significa que o novo tamanho será 20. O vetor é a única classe diferente de ArrayList para implementar o RandomAccess. O vetor está tendo quatro construtores, e um deles leva dois parâmetros. Vector (int initialCapacity, int capacityIncrement) capacityIncrement é a quantidade pela qual a capacidade é aumentada quando o vetor transborda, para ter mais controle sobre o fator de carga.
Algumas outras diferenças são: