Estou tentando descobrir quando e por que usar um dicionário ou um HashTable. Pesquisei um pouco aqui e encontrei pessoas falando sobre as vantagens genéricas do Dicionário com as quais concordo totalmente, o que leva a vantagem do boxe e do unboxing para um pequeno ganho de desempenho.
Mas eu também li que o Dicionário nem sempre retornará os objetos na ordem em que foram inseridos, coisa que está classificada. Onde, como um HashTable. Pelo que entendi, isso faz com que o HashTable seja muito mais rápido em algumas situações.
Minha pergunta é realmente, quais seriam essas situações? Estou errado nas minhas suposições acima? Quais situações você pode usar para escolher uma acima da outra (sim, a última é um pouco ambígua).
Respostas:
System.Collections.Generic.Dictionary<TKey, TValue>
e asSystem.Collections.Hashtable
classes mantêm uma estrutura de dados da tabela de hash internamente. Nenhum deles garante a preservação da ordem dos itens.Deixando de lado os problemas de boxe / unboxing, na maioria das vezes, eles devem ter desempenho muito semelhante.
A principal diferença estrutural entre eles é que
Dictionary
depende do encadeamento (manutenção de uma lista de itens para cada depósito de tabela de hash) para resolver colisões, enquantoHashtable
usa o rehashing para resolução de colisão (quando ocorre uma colisão, tenta outra função de hash para mapear a chave para um depósito) .Há pouco benefício em usar a
Hashtable
classe se você estiver direcionando para o .NET Framework 2.0+. É efetivamente tornado obsoleto porDictionary<TKey, TValue>
.fonte
Hashtable
. As tabelas de hash armazenam três informações em uma entrada: hash da chave, a própria chave e o valor. Para itens com hash igual, será necessário percorrer a lista para encontrar o item com chave igual e retornar seu valor. Isso também é verdadeHashtable
também. Como desenvolvedor, usandoDictionary
normalmente, você não precisa se preocupar com isso.Eu acho que isso não significa nada para você agora. Mas apenas para referência para pessoas que param por
Teste de desempenho - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
Alocação de memória:
Tempo usado para inserir:
Tempo para pesquisar um item:
fonte
Diferenças entre Hashtable e Dicionário
Dicionário:
Hashtable:
fonte
Outra diferença importante é que o tipo Hashtable suporta vários leitores sem bloqueio e um único gravador ao mesmo tempo, enquanto o Dictionary não.
fonte
Link: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
fonte
Ambos são efetivamente da mesma classe (você pode ver a desmontagem). O HashTable foi criado primeiro antes do .Net possuir genéricos. Dicionário, no entanto, é uma classe genérica e oferece fortes benefícios de digitação. Eu nunca usaria o HashTable, pois o Dictionary não custa nada para você usar.
fonte
Outra diferença importante é que
Hashtable
é seguro para threads.Hashtable
integrou segurança de encadeamento de vários leitores / gravador único (MR / SW), o que significa queHashtable
permite UM gravador junto com vários leitores sem travar. No caso deDictionary
não haver segurança de encadeamento, se você precisar de segurança de encadeamento, deverá implementar sua própria sincronização.Para elaborar mais:
fonte
Os dicionários têm a vantagem de ser do tipo genérico, o que o torna seguro e um pouco mais rápido devido à falta de boxe. A tabela de comparação a seguir (construída usando as respostas encontradas em uma postagem de pergunta do SO semelhante ) ilustra alguns dos outros motivos que suportam dicionários sobre tabelas de hash (ou vice-versa).
fonte
Se você se preocupa com a leitura, que sempre retornará os objetos na ordem em que são inseridos em um dicionário, consulte
OrderedDictionary - os valores podem ser acessados por meio de um índice inteiro (por ordem em que os itens foram adicionados) SortedDictionary - os itens são classificados automaticamente
fonte
O dicionário é mais rápido que o hashtable, pois o dicionário é um tipo forte genérico. O Hashtable é mais lento, pois leva o objeto como tipo de dados, o que leva ao boxe e ao unboxing.
fonte