Diferença entre ArrayList, Vector e LinkedList

5 respostas
CrOnNoS

Olhei aqui ali e vi que o ArrayList e Vector tem a diferença mais básica de que o vector é threadsafe por default e o ArrayList não. Ainda não estudei threads então não faço questão de aprofundar nisso agora, portanto queria saber mais das outras diferenças.

Por exemplo, Vector dá para configurar o incremento de capacidade de quando a capacidade estoura. Porque só vector tem essa opção ?
Que outras diferenças importantes há entre os dois ?

E, tirando o fator de desempenho e de que a linked tem referência aos nós vizinhos, a diferença entre as list e linkedlist é só a forma de acesso ? por ter métodos para acessar o primeiro e último elemento ?

5 Respostas

B

Sobre o incremento de capacidade, eu diria que é por que na época que fizeram o Vector, acharam que seria bom ter essa opção, e quando fizeram o ArrayList no Java 1.2, viram não havia a necessidade. Só mandando um email pra Sun mesmo pra saber.

Sobre o LinkedList, ele também implementa as interfaces Queue e Deque, mas não implementa a interface marcadora RandomAccess. São as diferenças principais.

CrOnNoS

E porque a linked não implementa o RandomAccess se ele tem métodos para acesso direto ?

E outra coisa (tentar não criar outro topic), qual a vantagem de se usar iterator ? Tem algum caso que ele TEM que ser usado ?

Paulo_Silveira

CrOnNoS:
E porque a linked não implementa o RandomAccess se ele tem métodos para acesso direto ?

Oi Cronos. So devem implementar RandomAccess as listas que podem acessar seus elementos “rapidamente” (tempo constante computacional). Como LinkedList é uma lista ligada, ela leva tempo linear (metodo get(i) é “lento” em relacao a ArrayList).

CrOnNoS:

E outra coisa (tentar não criar outro topic), qual a vantagem de se usar iterator ? Tem algum caso que ele TEM que ser usado ?

Sim! É fundamental usar o Iterator em muitos casos, pois voce pode estar usando uma lista que nao é randomaccess, e ai usar o get(i) diretamente pode te causar serios problemas de performance ao simplesmente percorrer uma lista (o consumo de tempo sera quadratico!)

De uma olhada no artigo Interface versus Implementacao disponivel em www.arquiteturajava.com.br

B

Leia a documentação com detalhes sobre o que classes que implementem RandomAccess devem garantir:
http://java.sun.com/javase/6/docs/api/java/util/RandomAccess.html

Quando comparo coleções com iterators, e faço uma analogia a filmes distribuídos via download completo, ou via streaming.

Com coleções normalmente você já tem todos os elementos em memória, e supõe que a sua memória é grande o bastante para conter todos eles. Também supõe que você tem processamento o suficiente para manipular todos eles de uma vez. O exemplo do filme baixado é que ele ocupa bastante espaço, mas você pode acessar qualquer ponto do filme imediatamente. Também demorou bastante para que você pudesse começar a assistir, pois precisava baixar tudo primeiro.

Com iteradores, você pega o começo de um fio de dados, e vai até o fim um por um. Você só precisa alocar memória para o elemento com que você está trabalhando no momento, e só precisa de processamento para trabalhar com ele. No streaming de filmes, você já pode assistir o filme enquanto recebe ele, porém é capaz de não poder pular cenas.

Fora também que iterators são uma forma padronizada de acessar qualquer coleção. Set, por exemplo, não há como acessar um elemento sem usar um iterator.

A pergunta principal que faço é:

O teu cliente pode esperar 5 minutos até virem todos os registros da base que ele pediu, ou você prefere já mandar os dados assim que ficarem prontos? (não vou entrar em detalhes de paginação aqui)

CrOnNoS

Leia a documentação com detalhes sobre o que classes que implementem RandomAccess devem garantir:
http://java.sun.com/javase/6/docs/api/java/util/RandomAccess.html

Eu tinha lido na primeira vez que você comentou da interface mas não tinha entendido bem pela documentação, por isso perguntei sobre.
No caso, a linkedlist toda vez que chama o método get(i) ela percorreria a lista toda para chegar no elemento ?

Quando comparo coleções com iterators, e faço uma analogia a filmes distribuídos via download completo, ou via streaming.

Com coleções normalmente você já tem todos os elementos em memória, e supõe que a sua memória é grande o bastante para conter todos eles. Também supõe que você tem processamento o suficiente para manipular todos eles de uma vez. O exemplo do filme baixado é que ele ocupa bastante espaço, mas você pode acessar qualquer ponto do filme imediatamente. Também demorou bastante para que você pudesse começar a assistir, pois precisava baixar tudo primeiro.

Com iteradores, você pega o começo de um fio de dados, e vai até o fim um por um. Você só precisa alocar memória para o elemento com que você está trabalhando no momento, e só precisa de processamento para trabalhar com ele. No streaming de filmes, você já pode assistir o filme enquanto recebe ele, porém é capaz de não poder pular cenas.

Fora também que iterators são uma forma padronizada de acessar qualquer coleção. Set, por exemplo, não há como acessar um elemento sem usar um iterator.

A pergunta principal que faço é:

O teu cliente pode esperar 5 minutos até virem todos os registros da base que ele pediu, ou você prefere já mandar os dados assim que ficarem prontos? (não vou entrar em detalhes de paginação aqui)

Humm me dexou ainda mais curioso mas acho que agora não é bem a hora de sair questionando mais hehe
Vou ver se googleio material bom sobre os iterator mas, vou dexar uma questão mesmo assim.
Então, no caso quando você cria um Iterator, você está criando um objeto que tem encapsulado uma forma de acessar um membro por vez, de uma certa fonte.
Em caso de acesso a dados persistidos em um banco ou arquivo por exemplo, entraria bem na sua analogia onde eu iria acessar um elemento por vez sem ter que obter todos antes.
E no caso de usar uma Collection que não implemente RandomAccess, o iterator me permite iterar o objeto sem ter o overhead de iterar do elemento 0 até o x desejado em cada get(index).
Entendi certo até agora ?
E no caso de uma ArrayList então, que implementa o RandomAccess, teria alguma vantagem no uso de iterators ?, mesmo já tendo a ArrayList preenchida em memória.

E muito obrigado pelas respostas e apostilas, etc ajudaram muito.

Criado 19 de setembro de 2009
Ultima resposta 19 de set. de 2009
Respostas 5
Participantes 3