Pregunta ¿Por qué se prefiere Dictionary a Hashtable?


En la mayoría de los lenguajes de programación, los diccionarios son preferibles a los hashtables. ¿Cuáles son las razones detrás de eso?


1203
2017-11-19 09:24


origen


Respuestas:


Por lo que vale, un diccionario es (conceptualmente) una tabla hash.

Si quisieras decir "¿por qué usamos el Dictionary<TKey, TValue> clase en lugar de la Hashtable clase? ", entonces es una respuesta fácil: Dictionary<TKey, TValue> es un tipo genérico, Hashtable no es. Eso significa que obtienes seguridad de tipo con Dictionary<TKey, TValue>, porque no puede insertar ningún objeto aleatorio en él, y no tiene que emitir los valores que saca.

Curiosamente, el Dictionary<TKey, TValue> implementación en .NET Framework se basa en Hashtable, como puede ver en este comentario en su código fuente:

El diccionario genérico fue copiado de la fuente de Hashtable

Fuente 


1405
2017-11-19 09:28



Dictionary <<< >>> Hashtable diferencias:

  • Genérico  <<< >>> No genérico
  • Necesariamente sincronización de hilo propio <<< >>> Ofertas a salvo de amenazas versión a través Synchronized() método
  • Artículo enumerado: KeyValuePair <<< >>> Artículo enumerado: DictionaryEntry
  • Más nuevo (> .NET 2.0) <<< >>> Más viejo (desde .NET 1.0)
  • es en System.Collections.Generic <<< >>> está en Sistema.Colecciones 
  • Solicitud de clave no existente arroja una excepción <<< >>> Solicitud de clave no existente devuelve nulo
  • potencialmente un poco más rápido para los tipos de valor <<< >>> un poco más lento (necesita boxeo / unboxing) para tipos de valor

Dictionary / Hashtable similitudes

  • Ambos son internos hashtables == acceso rápido a datos de muchos elementos según la clave
  • Ambos necesitan llaves inmutables y únicas
  • Las llaves de ambos necesitan poseer GetHashCode() método

Similar Colecciones .NET (candidatos para usar en lugar de Dictionary y Hashtable):

  • ConcurrentDictionary - a salvo de amenazas (se puede acceder de forma segura desde varios subprocesos al mismo tiempo)
  • HybridDictionary - rendimiento optimizado (para algunos artículos y también para muchos artículos)
  • OrderedDictionary - los valores pueden ser accedido a través del índice int (por orden en que se agregaron los artículos)
  • SortedDictionary - artículos ordenado automáticamente
  • StringDictionary - fuertemente tipado y optimizado para cadenas

564
2018-04-21 10:32



Porque Dictionary es una clase genérica ( Dictionary<TKey, TValue> ), de modo que el acceso a su contenido es seguro para el tipo (es decir, no es necesario lanzar desde Object, como lo haces con un Hashtable)

Comparar

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

a

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

Sin embargo, Dictionary se implementa como Hashtable dentro, por lo que técnicamente funciona de la misma manera.


163
2017-11-19 09:27



FYI: En .NET, Hashtable es seguro para subprocesos para ser utilizado por múltiples hilos de lectura y un solo hilo de escritura, mientras que en Dictionary los miembros estáticos públicos son seguros para subprocesos, pero no se garantiza que ningún miembro de instancia sea seguro para subprocesos.

Tuvimos que cambiar todos nuestros diccionarios de nuevo a Hashtable Debido a esto.


80
2017-11-19 11:55



En .NET, la diferencia entre Dictionary<,> y HashTable es principalmente que el primero es un tipo genérico, por lo que obtienes todos los beneficios de los genéricos en términos de control de tipo estático (y reducción del boxeo, pero esto no es tan grande como la gente tiende a pensar en términos de rendimiento; hay una definición costo de memoria para el boxeo, sin embargo).


62
2017-11-19 09:28



La gente dice que un diccionario es lo mismo que una tabla hash.

Esto no es necesariamente cierto. Una tabla hash es una implementación de un diccionario. Uno típico en eso, y puede ser el predeterminado en .NET, pero no es por definición el único.

También podría implementar un diccionario con una lista vinculada o un árbol de búsqueda, simplemente no sería tan eficiente (para algunos indicadores de eficiencia).


27
2017-11-19 13:03



Collections & Generics son útiles para manejar grupos de objetos. En .NET, todos los objetos de colecciones vienen bajo la interfaz IEnumerable, que a su vez tiene ArrayList(Index-Value)) & HashTable(Key-Value). Después de .NET framework 2.0, ArrayList & HashTable fueron reemplazados por List & Dictionary. Ahora el Arraylist & HashTable no se usan más en proyectos de hoy en día.

Llegando a la diferencia entre HashTable & Dictionary, Dictionary es genérico donde como Hastable no es genérico Podemos agregar cualquier tipo de objeto a HashTable, pero mientras recuperamos, debemos convertirlo al tipo requerido. Entonces, no es seguro. Sino dictionary, mientras se declara a sí mismo podemos especificar el tipo de clave y valor, por lo que no es necesario lanzar mientras se recupera.

Veamos un ejemplo:

Tabla de picadillo

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

Diccionario,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

21
2017-09-17 11:10