Quais são as diferenças entre ArrayList e Vector?

352

Quais são as diferenças entre as duas estruturas de dados ArrayList e Vector e onde você deve usar cada uma delas?

KushalP
fonte
5
Não estou vendo a duplicata exata aqui.
Jeff Atwood
2
Bem, você também pode criar vetores em java - Vector v = new Vector(3, 2);
sgsi
Nunca use Vector, use ArrayListor LinkedListorArrayDeque

Respostas:

365

Diferenças

  • Os vetores são sincronizados, ArrayLists não.
  • Métodos de crescimento de dados

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.

Referência

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%.

Referência

Sev
fonte
7
@Rei exatamente o que ele disse: Vários segmentos ( docs.oracle.com/javase/tutorial/essential/concurrency/... )
RecursiveExceptionException
E a leitura de um ArrayList de uma maneira multithread? Isso é seguro para threads?
Xunie 20/10
@Xunie Ler a partir de ArrayList ou outras classes de coleção nunca será um problema. O problema surge quando você está adicionando ou removendo ou modificando valores existentes no ArrayList ou na coleção.
Sainath reddy
85

Como a documentação diz, a Vectore um ArrayListsão quase equivalentes. A diferença é que o acesso a Vectoré sincronizado, enquanto o acesso a ArrayListnão é. O que isso significa é que apenas um encadeamento pode chamar métodos por Vectorvez 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.synchronizedListpara criar uma lista sincronizada, obtendo o equivalente a a Vector.

Antal Spector-Zabusky
fonte
53

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.

Boêmio
fonte
10
sincronizado, mas não é seguro? O que isso significa? [eu sou iniciante]
Dineshkumar
13
O @Dineshkumar Vectorfoi 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.
Bohemian
11
@Dineshkumar veja esta pergunta
Bohemian
3
@ Dineshkumar desculpe - não era um bom link. aqui está a resposta definitiva . Em suma, sua sincronização é inútil.
Bohemian
7
Curiosidade: O Stack of Java1.7 usa a classe Vector.
Tobi
26

ArrayList é mais recente e 20 a 30% mais rápido.

Se você não precisar de algo explicitamente aparente Vector, useArrayList

Oli
fonte
32
Você pode apoiar a reivindicação, dando provas de 20-30% faster?
User
5
@user Na época, era apenas uma experiência pessoal de clunking em grandes arrays. Nos últimos três anos, não posso apontar exatamente o que eu estava falando, mas existem muitos parâmetros de referência por aí. Não é até threading onde você vê os maiores saltos, mas aqui está um: javacodegeeks.com/2010/08/…
Oli
Os 20-30% correspondem apenas, se você ler E gravar na lista Vetor / matriz, pois a função de crescimento causará o maior impacto. Se você tem um benchmark que escreve apenas uma vez e, em seguida, executa só lê vai entregar um resultado diferente
Tobi
2
Forneça uma evidência para seus dados
wiredmark
Como o vetor está sincronizado e o arraylist não está sincronizado, isso pode ser um motivo, o arraylist é mais rápido que o vetor.
Pergunte
23

Existem duas grandes diferenciações entre Vector e ArrayList.

  1. 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.

  2. 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:

  1. Para obter o elemento em um local específico do Vector, usamos a função elementAt (int index). Este nome da função é muito extenso. Em vez disso, em ArrayList, temos get (int index), que é muito fácil de lembrar e usar.
  2. Da mesma forma, para substituir um elemento existente por um novo elemento em Vector, usamos o método setElementAt (), que é muito demorado e pode irritar o programador a usar repetidamente. Em vez disso, o ArrayList possui o método add (int index, object), que é fácil de usar e lembrar. Assim, eles têm nomes de funções mais amigáveis ​​ao programador e fáceis de usar no ArrayList.

Quando usar qual?

  1. Tente evitar o uso completo de vetores. ArrayLists pode fazer tudo o que um vetor pode fazer. Mais sobre ArrayLists, por padrão, não são sincronizadas. Se desejar, você pode sincronizá-lo sempre que precisar, usando a classe util Collections.
  2. ArrayList é fácil de lembrar e usar nomes de funções.

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.

user1923551
fonte
5
Informações incorretas (ativadas) sobre o tamanho da cultivar para ArrayLIst e Vector, caso contrário, uma resposta bastante boa.
Nenad Bulatovic
O crescimento de Vector está dobrando com os documentos necessários. Docacle.oracle.com/javase/7/docs/api/java/util/Vector.html while of ArrayList "Os detalhes da política de crescimento não são especificados além do fato de adicionar um elemento custo de tempo amortizado constante ". docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib
Não entendo como o nome do método pode ser um critério para usar ou não esse método.
Surender Kherwa
14

ArrayListe Vectorambos implementam a interface List e mantém a ordem de inserção. Mas há muitas diferenças entre ArrayListe Vectorclasses ...

ArrayList -

  1. ArrayList não está sincronizado.
  2. ArrayList incrementa 50% do tamanho atual da matriz se o número de elementos exceder sua capacidade.
  3. ArrayList não é uma classe herdada, é introduzida no JDK 1.2.
  4. ArrayList é rápido porque não é sincronizado.
  5. ArrayList usa a interface Iterator para percorrer os elementos.

Vetor -

  1. Vector está sincronizado.
  2. Vector incrementos de 100% significa duplicar o tamanho da matriz se o número total de elementos exceder a sua capacidade.
  3. Vector é uma classe herdada.

  4. 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.

  5. Vectorusa 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

roottraveller
fonte
10

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: insira a descrição da imagem aqui

subhashis
fonte
11
Por que adicionar objetos no início e no final no LinkedList é lento? Não deveria ser mais rápido que AMB arrayList e vetor?
CHANist
@ CHANist Eu também concordo. Adicionar um objeto no início e no final deve ser mais rápido do que adicionar um objeto no meio dele.
Rahul Rastogi 19/07
11
O idioma usado na coluna LinkedList desta tabela é contraditório. Anexar e anexar a um LinkedList são mais rápidos do que adicionar elementos no meio, mas mais lentos do que anexar ou adicionar a ArrayLists ou Vectors. Isso ocorre porque toda inserção requer alocação de memória com referências não locais, aumentando a chance de erros de cache. Mesmo que a pesquisa em um LinkedList seja linear com o número de elementos e um ponteiro para o final não seja armazenado, o acréscimo ainda é mais rápido do que o acréscimo porque a memória é realocada apenas para um elemento.
Sophia Gold