Utilizzare un’istanza di un object come chiave in hashmap e quindi accedervi con esattamente il nuovo object?

Ho un hasmap con un object chiave,

HashMap test; 

e fai una nuova chiave (“la stessa”) come chiave ..

quindi è come ..:

 test.put(new Key("the same"), someObject); 

(senza memorizzare quella chiave in una variabile)

quindi … dopo un po ‘… voglio accedere all’hashmap, perché non ho l’object, ho provato a creare una nuova chiave (“la stessa”) e a farla diventare una chiave. Ma non ha funzionato.

Come farlo funzionare? (senza salvare la prima “chiave” dell’object in una variabile)

Quindi nel frattempo, per ora, sto usando l’object String come chiave.

 HashMap 

È necessario implementare hashCode ed è equals a Key . L’ implementazione predefinita di questi metodi controlla semplicemente l’uguaglianza di istanza (in altre parole, due Object saranno uguali solo se sono in effetti lo stesso object).

Ulteriori letture

Java efficace: metodi comuni a tutti gli oggetti

Il tuo problema è probabile che Key non abbia implementato hashCode() ed equals() correttamente (o affatto). Per essere usato come chiave HashMap la class deve implementare questi due metodi per riflettere “l’uguaglianza” di due oggetti.

Se crei due istanze differenti con

 Key a = new Key("xyz"); Key b = new Key("xyz"); 

e si aspettano che siano uguali e funzionino in una HashMap , è necessario eseguire l’override di hashCode() modo che restituisca lo stesso valore in entrambe le istanze, e equals() restituisca true quando li si confronta.

Se l’identity framework dell’object è basata sul valore stringa, allora

 @Override public int hashCode() { return theStringValue.hashCode(); } 

e

 @Override public boolean equals(Object o) { return this.theStringValue.equals(o); } 

dovrebbe funzionare

Quando una class non sovrascrive i metodi equals() o hashCode() , vengono utilizzate le implementazioni predefinite trovate nella class Object . In particolare, equals() fa semplicemente un controllo per l’uguaglianza di riferimento.

Questo spiega immediatamente perché il tuo approccio non funziona: il nuovo object Key chiaramente non si riferisce al vecchio object Key .

Se desideri essere in grado di specificare una nuova istanza con la stessa proprietà, devi sostituire il metodo equals() con un’implementazione che soddisfi i criteri per l’uguaglianza delle chiavi. Dovresti anche eseguire l’override di hashCode() per avere il pieno controllo sul processo di confronto delle chiavi.