IdentityHashCode en el cubo de HashMap

byebye:

En detalla la implementación de HashMap, puedo leer:

When using comparators on insertion, to keep a
 * total ordering (or as close as is required here) across
 * rebalancings, we compare classes and identityHashCodes as
 * tie-breakers.

Si tengo constante hashCodey bien equalsy mi clase no implementa Comparableexactamente cómo va a romper los lazos y cómo se construye el árbol?

Me refiero - balde se transformará en un árbol y utilizará System.identityHashCodepara romper el empate. A continuación, voy a tratar de llamar containsKeymétodo con una instancia diferente (que tendrá el mismo hashCodey a.equals(b) == true) que tendrá diferente identityHashCodepor lo que es posible que el árbol será atravesada por el nodo incorrecto (la izquierda en vez derecha) y no va a encontrar una llave?

Me estoy perdiendo algo o esto es un comportamiento normal?

Tadeusz Sznuk:

El cubo utilizará identityHashCodedurante la inserción, pero las operaciones de búsqueda sólo utiliza códigos hash y compare()las llamadas (si está disponible). Esto significa que a veces tiene que escanear las dos subárboles de un nodo.

El aspecto de la lógica de búsqueda alinean este

do {
  if (... keys are equal or can be compared ...) {
    // Go left, right or return the current node
    ...
  } else if ((q = pr.find(h, k, kc)) != null)
    // Search the right subtree recursively
    return q;
  else
   // Go to the left subtree
   p = pl;
} while (p != null);

Ver http://hg.openjdk.java.net/jdk10/jdk10/jdk/file/ffa11326afd5/src/java.base/share/classes/java/util/HashMap.java#l1901 y tenga en cuenta que tieBreakOrder()(el método responsable de comparando identityHashCodes no se invoca en cualquier parte find().

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=167278&siteId=1
Recomendado
Clasificación