Come ottengo un ConcurrentHashMap
con chiavi deboli e hash di identità in Java? Penso che Google Guava Collections possa dare una cosa del genere, ma posso ottenerla dalla libreria standard? Quali altre opzioni ho?ConcurrentHashMap con chiavi deboli e hash di identità?
risposta
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
conWeakReference
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 chiaviWeakReference
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
ehashcode
. Ma è più probabile che sia inutilizzabile.Non penso che sarebbe possibile farlo eseguendo l'override dei metodi in
ConcurrentHashMap
oIdentityHashMap
.
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.
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.
Questo è corretto - perché è stato downvoted? Dovresti ricordare che l'uso delle chiavi deboli fa sì che l'uguaglianza delle chiavi sia valutata con '=='. –
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.
Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode
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
Eventuali commenti su possibili opzioni? –
Usa Google Guava. Questa è un'opzione. (Qualche ragione per non usarlo?) O scrivere la propria implementazione da zero. –
Per quanto riguarda le prestazioni della mappa richiesta da Guava, sarà uguale a 'java.util.concurrent.ConcurrentHashMap'? –