2013-03-17 13 views

risposta

9

Penso che Google Guava Collections possa dare una cosa del genere, ma posso ottenerla dalla libreria standard?

La risposta breve è No. Java SE non implementa questa particolare combinazione.

  • Si potrebbe creare un'istanza di un java.util.concurrent.ConcurrentHashMap con WeakReference chiavi, e fare qualche lavoro extra per implementare la rimozione di voci della mappa per riferimenti interrotti, ma questo non vi darà la semantica identità hash.

  • È possibile creare un'istanza di java.util.IdentityHashMap con le chiavi WeakReference ed eseguire alcune operazioni aggiuntive per implementare la rimozione delle voci della mappa per i riferimenti non funzionanti, ma ciò non darà un comportamento concorrente.

  • L'utilizzo di un java.util.WeakHashMap non fornisce né la concurrenza né l'hashing dell'identità.

  • Si potrebbe (in teoria) avvolgere la classe chiave in qualcosa che ha annullato i metodi naturali equals e hashcode. Ma è più probabile che sia inutilizzabile.

  • Non penso che sarebbe possibile farlo eseguendo l'override dei metodi in ConcurrentHashMap o IdentityHashMap.


Forse l'unica soluzione possibile sarebbe quello di cambiamento le classi principali equals e hashcode metodi per essere basato identità. Ma questo non funzionerà per i tipi di chiave "integrati" (specialmente quelli final) o per i casi in cui è necessario il valore equo/hashcode in altre parti dell'applicazione.

+0

Eventuali commenti su possibili opzioni? –

+1

Usa Google Guava. Questa è un'opzione. (Qualche ragione per non usarlo?) O scrivere la propria implementazione da zero. –

+0

Per quanto riguarda le prestazioni della mappa richiesta da Guava, sarà uguale a 'java.util.concurrent.ConcurrentHashMap'? –

1

L'implementazione di Google Guava sembra la soluzione più semplice. Si può inizializzare la mappa richiesta con new MapMaker().weakKeys().makeMap() e utilizzare proprio come si userebbe java.util.concurrent.ConcurrentHashMap. Vedere lo apidoc per ulteriori dettagli.

+0

Questo è corretto - perché è stato downvoted? Dovresti ricordare che l'uso delle chiavi deboli fa sì che l'uguaglianza delle chiavi sia valutata con '=='. –

0

search ConcurrentWeakIdentityHashMap, otterrai molti esempi. Ho scritto personalmente un attrezzo, perché penso che l'hashCode di org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap $ WeakReference sia così brutto.

Example of ehcache3

Example I wrote

Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode

+0

Grazie per il secondo link. Risolve molti dei miei problemi. Funziona come un fascino nel mio progetto di intelligenza artificiale. Dovevo però cambiare l'ambito della classe e i costruttori in pubblico – Tschallacka