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.
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%.
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.
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.
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.
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.
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:
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.
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?
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.
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.
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.
Vectorusa a interface de enumeração para percorrer os elementos. Mas também pode usar o Iterator.
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.
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.
Vector v = new Vector(3, 2);
Vector
, useArrayList
orLinkedList
orArrayDeque
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.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
fonte
Como a documentação diz, a
Vector
e umArrayList
são quase equivalentes. A diferença é que o acesso aVector
é sincronizado, enquanto o acesso aArrayList
não é. O que isso significa é que apenas um encadeamento pode chamar métodos porVector
vez e há uma pequena sobrecarga na aquisição do bloqueio; se você usar umArrayList
, não é esse o caso. Geralmente, você desejará usar umArrayList
; 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 aVector
.fonte
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
.fonte
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
fonte
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.
fonte
ArrayList
eVector
ambos implementam a interface List e mantém a ordem de inserção. Mas há muitas diferenças entreArrayList
eVector
classes ...ArrayList -
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
fonte
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:
fonte