2013-06-14 13 views
10

quando sarebbe opportuno un tempo ragionevole per eseguire la linea n. 4 anziché la riga n. 3? O sono invocazioni perfettamente ridondanti?uso di System.identityHashCode (obj) - quando? perché?

1 Object o1 = new Object(); 

2 

3 int hcObj = o1.hashCode(); 

4 int hcSys = System.identityHashCode(o1); 
+0

Uhm, buona domanda ... A proposito, entrambi i metodi restituiscono un int, non un lungo – fge

risposta

11

A volte si potrebbe desiderare di creare un insieme di oggetti distinguibili. Alcuni di questi oggetti potrebbero essere uguali a l'uno con l'altro, ma è comunque necessario fare riferimento a tutti loro ... solo buttare via riferimenti realmente duplicati. Si potrebbe farlo perché l'implementazione equals non è quello che ti interessa (alcune classi sostituiscono equals quando davvero non si vuole loro di) o perché si sta effettivamente cercando di contare istanze separate ecc

Per farlo in modo efficiente (ovvero supportato da una tabella hash di qualche tipo), si desidera un codice hash basato sull'identità piuttosto che sull'uguaglianza - che è esattamente ciò che fornisce identityHashCode. È raramente utile, ma a volte può essere utile.

+0

In breve, cosa fa 'Equivalence.identity() 'di Guava? Ma anche in questo caso, si ha 'IdentityHash {Map, Set}' – fge

+3

@fge: 'System.identityHashCode' è il modo in cui tutte queste strutture di dati sono implementate. –

+0

"(alcuni oggetti si implementano alla pari quando davvero non li vuoi)" Ama questa parte della tua risposta. Grazie. –

3

Per un semplice Object, sì, è ridondante. Ma ci sono casi in cui una classe potrebbe voler utilizzare l'implementazione predefinita hashCode (basata sull'eguaglianza di riferimento) su un'istanza di un tipo che potrebbe avere sostituito hashCode.

Grepcode lists these call sites, ovvero compreso IdentityHashMap tra gli altri.

Problemi correlati