Estoy tratando de averiguar cuándo y por qué usar un Diccionario o una HashTable. He hecho una pequeña búsqueda aquí y he encontrado personas que hablan sobre las ventajas genéricas del Diccionario con las que estoy totalmente de acuerdo, lo que lleva la ventaja del boxeo y el unboxing para un ligero aumento de rendimiento.
Pero también he leído que el Diccionario no siempre devolverá los objetos en el orden en que se insertan, cosa que está ordenada. Donde como una HashTable lo hará. Según tengo entendido, esto lleva a que HashTable sea mucho más rápido para algunas situaciones.
Mi pregunta es realmente, ¿cuáles podrían ser esas situaciones? ¿Estoy equivocado en mis supuestos anteriores? ¿Qué situaciones podría usar para elegir una por encima de la otra (sí, la última es un poco ambigua)?
Respuestas:
System.Collections.Generic.Dictionary<TKey, TValue>
y lasSystem.Collections.Hashtable
clases mantienen internamente una estructura de datos de tabla hash. Ninguno de ellos garantiza preservar el orden de los artículos.Dejando a un lado los problemas de boxeo / unboxing, la mayoría de las veces, deberían tener un rendimiento muy similar.
La principal diferencia estructural entre ellos es que se
Dictionary
basa en el encadenamiento (mantener una lista de elementos para cada grupo de tablas hash) para resolver colisiones, mientras queHashtable
utiliza el cambio de color para la resolución de colisiones (cuando ocurre una colisión, prueba con otra función hash para asignar la clave a un cubo) .Hay pocos beneficios al usar la
Hashtable
clase si está apuntando a .NET Framework 2.0+. Efectivamente se vuelve obsoleto porDictionary<TKey, TValue>
.fuente
Hashtable
. Las tablas hash almacenan 3 piezas de información en una entrada: hash de clave, clave en sí misma y el valor. Para los elementos con el mismo hash, tendrá que recorrer la lista para encontrar el elemento con la misma clave y devolver su valor. Esto es bastante cierto paraHashtable
también. Como desarrollador que usaDictionary
normalmente, no necesita preocuparse por eso.Supongo que no significa nada para ti ahora. Pero solo como referencia para las personas que pasan
Prueba de rendimiento - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
Asignación de memoria:
Tiempo utilizado para insertar:
Tiempo para buscar un artículo:
fuente
Diferencias entre Hashtable y Dictionary
Diccionario:
Tabla de picadillo:
fuente
Otra diferencia importante es que el tipo Hashtable admite múltiples lectores sin bloqueo y un solo escritor al mismo tiempo, mientras que Dictionary no.
fuente
Enlace: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
fuente
Ambos son efectivamente la misma clase (puede ver el desmontaje). HashTable se creó primero antes de que .Net tuviera genéricos. Diccionario, sin embargo, es una clase genérica y le brinda fuertes beneficios de escritura. Nunca usaría HashTable ya que Dictionary no te cuesta nada usar.
fuente
Otra diferencia importante es que
Hashtable
es seguro para subprocesos.Hashtable
ha incorporado seguridad de subprocesos de lector múltiple / escritor único (MR / SW), lo que significa queHashtable
permite UN escritor junto con múltiples lectores sin bloqueo. En el caso de queDictionary
no haya seguridad de hilo, si necesita seguridad de hilo debe implementar su propia sincronización.Para elaborar más a fondo:
fuente
Los diccionarios tienen la ventaja de ser de tipo genérico, lo que lo hace seguro y un poco más rápido debido a la falta de necesidad de boxeo. La siguiente tabla de comparación (construida con las respuestas encontradas en una publicación similar de preguntas SO ) ilustra algunas de las otras razones que admiten diccionarios sobre tablas hash (o viceversa).
fuente
Si le interesa la lectura que siempre devolverá los objetos en el orden en que se insertan en un Diccionario, puede echar un vistazo a
OrderedDictionary : se puede acceder a los valores a través de un índice entero (por orden en que se agregaron los elementos) SortedDictionary : los elementos se ordenan automáticamente
fuente
El diccionario es más rápido que la tabla hash, ya que el diccionario es un tipo fuerte genérico. Hashtable es más lento, ya que toma el objeto como tipo de datos, lo que conduce al boxeo y al desempaquetado.
fuente