C# - Diferenças entre Hashtable e Dictionary

 Hoje veremos as diferenças entre as classes Hashtable e Dictionary.

Hashtable

Um Hashtable é uma coleção de pares de chave/valor que são organizados com base no código hash da chave.

Uma Hashtable é usada para criar uma coleção que usa uma tabela de hash para armazenamento.

Quando você insere um par chave/valor em uma Hashtable, ela rastreia automaticamente qual chave pertence a qual valor e permite recuperar o valor que está associado com uma chave especificada rápida e facilmente.

Assim uma Hashtable é como um recipiente utilizado para armazenar dados em pares de chave/valor  onde as chaves são usadas como índice e ajudam a localizar os valores rapidamente.

Exemplo de código:

using System;
using System.Collections;

namespace Hash_Dict1
{
    class Program
    {
        static void Main(string[] args)
        {
            Hashtable minhaTabelaHash = new Hashtable();

            // incluindo um par key/value
            // usando o método Add

            minhaTabelaHash.Add("a1", "Macoratti.net");
            minhaTabelaHash.Add("a2", "quase tudo");
            minhaTabelaHash.Add("a3", "para .NET");

            foreach (DictionaryEntry elemento in minhaTabelaHash)
            {
                Console.WriteLine($"Key:- {elemento.Key} e Value:- {elemento.Value} ");
            }
            Console.ReadKey();
        }
    }
}

Resultado:

Lembrando que não podem existir chaves duplicadas em uma Hashtable e se você tentar adicionar uma chave que já existe vai ocorrer uma exceção.

Outro detalhe importante é que quando usamos um laço foreach para percorrer uma Hashtable recebemos como retorno um DictionaryEntry.

Dictionary

Um Dictionary é uma coleção genérica que geralmente é usada para armazenar pares chave/valor sendo dinâmico por natureza o que significa que o tamanho do dicionário cresce conforme a necessidade.

Um Dictionary esta baseado em uma tabela de hash, o que significa que ele usa uma pesquisa de hash, que é um algoritmo eficiente para procurar coisas onde ele mapeia uma chave para um valor e assim não pode ter chaves duplicadas,

Exemplo de código:

using System;
using System.Collections.Generic;
namespace Hash_Dict1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            // Cria um dicionario
            // usando a classe Dictionary<TKey, TValue>
            Dictionary<string, string> meuDicionario = new Dictionary<string, string>();
            // adiciona pares key/value
            // usando o método Add()
            meuDicionario.Add("a1", "Macoratti.net");
            meuDicionario.Add("a2", "quase tudo");
            meuDicionario.Add("a3", "para .NET");
            foreach (KeyValuePair<string, string> elemento in meuDicionario)
            {
                Console.WriteLine("Key:- {0} e Value:- {1}",
                                  elemento.Key, elemento.Value);
            }
            Console.ReadKey();
        }
    }
}

Resultado:



Diferenças entre Hashtable e Dictionary

Hashtable Dictionary
Uma  Hashtable é uma coleção não genérica Um Dictionary é uma coleção genérica
Em uma Hashtable, você pode armazenar pares de chave/valor do mesmo tipo ou de tipos diferentes. Em um Dictionary, você pode armazenar pares de chave/valor do mesmo tipo.
Em uma Hashtable, não há necessidade de especificar o tipo de chave e valor. Em um Dictionary você precisa especificar o tipo da chave e valor.
A recuperação de dados é mais lenta do que em um Dictionary devido ao boxing/unboxing. A recuperação de dados é mais rápida do que Hashtable devido a não ter que realizar o  boxing/unboxing.
Em uma Hashtable, se você tentar acessar uma chave que não está presente na Hashtable, ela fornecerá valores nulos. Em um Dictionary, se você tentar acessar uma chave que não está presente no Dicionário , ocorrerá um erro.
É Thread-Safe É Thread safe somente para os membros públicos e estáticos
Não mantém a ordem dos valores armazenados Sempre mantém a ordem dos valores armazenados

E estamos conversados...

"Nisto consiste o amor: não em que nós tenhamos amado a Deus, mas em que ele nos amou e enviou o seu Filho como propiciação pelos nossos pecados."
1 João 4:10


Referências:


José Carlos Macoratti