¿Por qué debería * no * anular GetHashCode ()?

C # tiene tipos de valores integrados que proporcionan igualdad de valores, mientras que Java no. Por lo tanto, escribir su propio código hash en Java puede ser una necesidad, mientras que hacerlo en C # puede ser una optimización prematura.

Es común escribir un tipo para usar como clave compuesta para usar en un Dictionary / HashMap. A menudo, en tales tipos, necesita igualdad de valor (equivalencia) en lugar de igualdad de referencia (identidad) , por ejemplo:

IDictionary<Person, IList<Movie> > moviesByActor; // e.g. initialised from DB
// elsewhere...
Person p = new Person("Chuck", "Norris");
IList<Movie> chuckNorrisMovies = moviesByActor[p];

Aquí, si necesito crear una nueva instancia de Persona para realizar la búsqueda, necesito Personimplementar la igualdad de valores; de lo contrario, no coincidirá con las entradas existentes en el Diccionario, ya que tienen una identidad diferente.

Para obtener la igualdad de valor, necesita una anulación Equals()y GetHashCode(), en ambos idiomas.

Las estructuras de C # (tipos de valor) implementan la igualdad de valor para usted (aunque sea potencialmente ineficiente) y proporcionan una implementación coherente de GetHashCode. Esto puede ser suficiente para las necesidades de muchas personas y no irán más allá para implementar su propia versión mejorada a menos que los problemas de rendimiento indiquen lo contrario.

Java no tiene una función de lenguaje incorporada. Si desea crear un tipo con semántica de igualdad de valores para usar como clave compuesta, debe implementar equals () y, por consiguiente, hashCode () usted mismo. (Hay ayudantes y bibliotecas de terceros para ayudarlo a hacer esto, pero nada integrado en el lenguaje mismo).

Describí los tipos de valores de C # como 'potencialmente ineficientes' para usar en un Diccionario porque:

  • La implementación de ValueType.Equalssí mismo a veces puede ser lenta. Esto se usa en las búsquedas de diccionario.
  • La implementación de ValueType.GetHashCode, si bien es correcta, puede producir muchas colisiones que conducen a un rendimiento muy bajo del Diccionario también. ¡Eche un vistazo a esta respuesta a una Q de Jon Skeet, que demuestra que KeyValuePair<ushort, uint>parece producir siempre el mismo código hash !
Respuesta 1

Si su objeto representa un valor o tipo, DEBERÍA anular el GetHashCode () junto con Equals. Nunca anulo los códigos hash para las clases de control, como "App". Aunque no veo ninguna razón por la cual incluso anular GetHashCode () en esas circunstancias sería un problema, ya que nunca se pondrán en posición de interferir con la indexación de la colección o las comparaciones.

Ejemplo:

public class ePoint : eViewModel, IEquatable<ePoint>
{
    public double X;

    public double Y;

    // Methods

    #region IEquatable Overrides

    public override bool Equals(object obj)
    {
        if (Object.ReferenceEquals(obj, null)) { return false; }

        if (Object.ReferenceEquals(this, obj)) { return true; }

        if (!(obj is ePoint)) { return false; }

        return Equals((ePoint)obj);
    }

    public bool Equals(ePoint other)
    {
        return X == other.X && Y == other.Y;
    }

    public override int GetHashCode()
    {
        return (int)Math.Pow(X,Y);
    }

    #endregion
Respuesta: 2

Estoy trabajando para poner en marcha una instancia de Cassandra, pero tengo problemas para decirle a Cassandra qué instalación de Java usar. La situación es la siguiente: el servidor tiene Java 6 instalado y ...

Estoy usando Jakarta commons-pool-1.5.6.jar. Tengo 2 grupos diferentes del mismo tipo de objeto (ej .: Coche). ¿Es la forma de evitar que el objeto regrese al grupo? Aquí hay una muestra: // CarPool se extiende ...

¿Por qué Java requiere un signo de doble igual (==) al comparar enteros en una declaración if? Por ejemplo if (x = 3.141) System.out.println ("x es igual a pi"); es incorrecto, debería ser si (x == ...

Estoy escribiendo algún software en Java. Estoy probando la funcionalidad de administración de cookies pero parece que no puedo hacer que las cookies funcionen. Escribí un PHP rápido que elimina una cookie, y lo probé en mi navegador ...