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 hashCode
y bien equals
y mi clase no implementa Comparable
exactamente 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.identityHashCode
para romper el empate. A continuación, voy a tratar de llamar containsKey
método con una instancia diferente (que tendrá el mismo hashCode
y a.equals(b) == true
) que tendrá diferente identityHashCode
por 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?
El cubo utilizará identityHashCode
durante 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 identityHashCode
s no se invoca en cualquier parte find()
.