2013-11-26 23 views
8

Gli oggetti non modificabili (ad eccezione di String come Integer e altre classi di wrapper ecc.) Sono adatti alle chiavi hashmap?Oggetti immutabili e chiavi hashmap

Qualcuno può spiegare come?

+1

Non preoccuparti. – Maroun

+4

Non è chiaro cosa stai cercando di ottenere. Hai preoccupazioni specifiche? È certamente una cattiva idea usare * gli oggetti mutabili * come chiavi - almeno se possono mutare in un modo che influenza il codice hash. –

+0

Cosa stai cercando di ottenere con quello? –

risposta

6

Se immutabile, l'hashcode dell'oggetto non cambia e consente di memorizzare nella cache l'hashcode di chiavi diverse che rende molto veloce il processo di recupero complessivo. Anche per oggetti mutabili, l'hashCode() potrebbe dipendere da campi che potrebbero cambiare, se questo accade non si sarà in grado di trovare la chiave (e il suo valore) in HashMap poiché hashCode() restituisce un valore diverso.

0

Se l'oggetto è immutabile e implementa correttamente hashcode/equals, è possibile utilizzarli come chiavi in ​​una hashmap.

1

sì perché non è modificabile.

lascia supporre che sto avendo una classe

MyKey key = new MyKey("shreyansh"); //assume hashCode=1234 
myHashMap.put(key, "value"); 

// Below code will change the key hashCode() and equals() 
// but it's location is not changed. 
key.setName("jogi"); //assume new hashCode=7890 

//below will return null, because HashMap will try to look for key 
//in the same index as it was stored but since key is mutated, 
//there will be no match and it will return null. 
myHashMap.get(new MyKey("shreyansh")); 

qui durante l'accesso che con il tasto "Shreyansh" tornerà NULLL

7

È possibile trovare la risposta qui: How HashMap works in Java

String, Integer e altre classi wrapper sono i candidati naturali della chiave HashMap, e String è anche la chiave più utilizzata, perché String è immutabile e definitiva, e sovrascrive equals e hashcod e() metodo. Un'altra classe wrapper condivide anche proprietà simili. L'immutabiilità è richiesta, al fine di evitare modifiche sui campi utilizzati per calcolare hashCode() perché se l'oggetto chiave restituisce hashCode diversi durante l'inserimento e il recupero di quanto non sarà possibile ottenere l'oggetto da HashMap. L'immutabilità è la migliore poiché offre anche altri vantaggi, come la sicurezza del thread. Se riesci a mantenere lo stesso hashCode solo rendendo definitivi determinati campi, puoi farlo anche tu. Poiché il metodo equals() e hashCode() viene utilizzato durante il recupero dell'oggetto value da HashMap, è importante che l'oggetto chiave sovrascriva correttamente questi metodi e segua il contatto. Se l'oggetto non equo restituisce un codice hash diverso da quello delle probabilità di collisione sarà meno che successivamente migliorerà le prestazioni di HashMap.

C'è anche un altro stack per la discussione: Why are immutable objects in hashmaps so effective

Sia codice hash e uguale metodo sono utilizzati in put e ottenere il metodo di HashMap. Devi assicurarti di poter sempre ottenere l'oggetto valore dalla mappa dopo averlo messo con l'oggetto chiave. Non importa se cambi l'oggetto chiave o no. Ma l'oggetto Immutabile è abbastanza buono per riuscirci.

+0

'Se riesci a mantenere lo stesso hashCode rendendo solo determinati campi finali, allora va anche per quello. "Questo significa che se una chiave è mutabile ma il suo hashcode non dipende da attributi mutabili e rimane uguale allora anche questo oggetto mutevole può essere una buona chiave di hashmap? –

+0

Penso che sia necessario mantenere uguali anche i tuoi pari. Altrimenti, non sostituirà il vecchio valore quando si inserisce nuovamente una voce con la chiave dopo aver modificato il valore del metodo equals. Questo non è previsto. – Jacky

+0

@aLearner Sarebbe un bene per te se guardi il codice sorgente di HashMap. – Jacky

Problemi correlati