Java coleções implementações (por exemplo HashMaps vs HashSet vs HashTable ...), qual é o custo de escolher o caminho errado? [fechadas]

StackOverflow https://stackoverflow.com/questions/1033482

Pergunta

No meu código eu padrão para usar ArrayList para todas as listas, HashMap para todos os mapas, HashSet para todos os conjuntos.

Do ponto de vista prático quanto estou perdendo em termos de flexibilidade, escalabilidade, facilidade de leitura e desempenho escolhendo a implementação de errado? Quando será que faz sentido gastar tempo para decidir usar um e não outro?

Eu certamente ver um caso muito clara de por que alguém usaria um LinkedList em vez de um ArrayList dadas certas circunstâncias. Quando é que alguém se sentir que é fundamental que usar um HashMap em vez de um TreeMap ou um HashTable? E sobre Sets?

Perguntas:

  1. O que é o custo de escolher mal?
  2. Alguém tem uma histórias de desastres sobre a escolha da implementação errado eo pegando fogo datacenter?
  3. Qualquer boas regras de ouro?
  4. Existem coleções implementações obscuros você não pode viver sem?

Eu li através de:

esta questão estar relacionada a partir de um ponto de vista teórico, mas eu' m mais interessado em um mundo real, para baixo na resposta trincheiras.

Foi útil?

Solução

Esta é uma pergunta muito geral, mas vou jogar em um par de thougts.

Se você estiver programação orientada a interfaces, em seguida, a flexibilidade não vai ter um grande sucesso. Por exemplo

void foo(List<E> list);

O custo de escolher mal podia ser visto em penalidades de desempenho. Por exemplo, a escolha de um LinkedList quando o acesso direto (como no ArrayList) é o que você está procurando.

Conjuntos tem um problema semelhante. Se você quiser manter coleções ordenadas sem duplicatas, um SortedSet seria uma escolha mais sábia ao longo de um HashSet. No último, você'd tem que classificar todo o conjunto manualmente (isto é, uma chamada para Collections.sort ())

<EDIT>

Quanto mapeia , há um monte de diferentes implementações. Cada um tem uma finalidade diferente. Por exemplo, há's SortedMap , analógico para SortedSet. Então, há's WeakHashMap , que o trabalho Indiferente como um HashMap, no sentido de que as chaves podem ser removidas pelo coletor de lixo. Como você pode imaginar, a escolha entre um HashMap e uma WeakHashMap não é trivial. Como sempre, depende do que você deseja implementar com eles.

</EDIT>

Em relação à história, no meu projeto atual, que substituiu um HashSet com um SortedSet porque o desempenho estava sendo afetada. DataCenter Não sofreu pegou fogo embora.

Os meus dois centavos.

Outras dicas

Assim, desde que você siga a prática boa OO da dependendo de um tipo abstrato , o que isso importa?

Se por exemplo você achar que você usou o Map errado, você simplesmente alterar a implementação você está usando e porque todas as suas dependências estão em Map tudo funciona como antes apenas com as diferentes características de desempenho.

Eu acho que você é bom para usar HashMap, HashSet, e ArrayList como suas implementações primários. Quando você precisa de um conjunto classificado, é bom saber que TreeSet está disponível; quando você está fazendo tipos recursiva de coisas, da mesma forma, é bom ter LinkedList no bolso de trás. Mas o programa a interfaces e então você pode trocar as implementações conforme necessário. E se as mesmas necessidades de recolha de processamento como (por exemplo) tanto um LinkedList e um ArrayList, não é grande coisa para construir um do outro.

Trabalhar com as implementações padrão que você listou. Quando há problemas de desempenho, e não há razão para acreditar que uma implementação alternativa seria melhor, trocá-lo - e medir a diferença. Quando você precisa de um comportamento especial (conjuntos classificados, por exemplo), usar as classes especiais.

Esta abordagem não me queimou ainda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top