HashSet (como HashMap) utiliza, así, hashing, para lograr O (1) amortizados set/prueba/eliminar el rendimiento. (había algunas suposiciones incorrectas en la pregunta sobre HashSet no usar hash.)
Ahora, en Java, todos los objetos son "hashable" - es decir, que tienen una función hashCode()
(ya que como descendientes de Object). La calidad de esta función de hash permitirá que un algoritmo hash alcance las características de rendimiento anticipadas mencionadas al "distribuir los objetos [uniformemente] a través de los cubos". (Las implementaciones por defecto de objeto de hashCode/es igual a la cantidad de objetar la identidad. En general, esto se debe cambiar para cualquier subclase.)
Sin embargo, si su clase implementa hashCode
mal (por ejemplo, devuelve 1 para todos los valores), entonces el rendimiento de HashSet/HashMap sufrirá mucho como resultado (para cualquier n no trivial). Es importante señalar que hashCode
determina el cubo pero equals
determina, así, la igualdad real que se puede utilizar incluso si el código hash es único y/o no hay colisiones (por ejemplo, para asegurarse de que la prueba/get no devuelve un falso positivo; podría eliminarse en un conjunto/inserto sin colisión).
Sólo asegúrese de seguir la configuración de los requisitos en Object WRT. hashCode
y equals
u objetos pueden perderse. Una función de hash deficiente que cumpla con las reglas seguirá funcionando, aunque con un rendimiento potencialmente deficiente. (Objeto mutable son especialmente problemáticos para su uso en los ADT de hash debido a que el código hash y/o igualdad no siempre pueden ser estables.)
Probablemente porque es un conjunto respaldado por un "HashMap", por lo que tiene ese tipo de rendimiento detrás las escenas. –
¿Qué quiere decir con "almacenado al azar"? Parece más bien que su teoría de la tabla hash necesita un pulimento. – spender
y la responsabilidad de una función de hash "buena" es mantener tanta entropía como sea posible. De modo que las claves hash se dividen por igual. – zengr