How do I get a ConcurrentHashMap
with weak keys and identity hashes in Java? I think Google Guava Collections can give such a thing, but can I get it from the standard library? What other options do I have?
I think Google Guava Collections can give such a thing, but can I get it from the standard library?
The short answer to that is No. Java SE does not implement this particular combination.
You could instantiate a java.util.concurrent.ConcurrentHashMap
with WeakReference
keys, and do some extra work to implement removal of map entries for broken references, but that won't give you identity hash semantics.
You could instantiate a java.util.IdentityHashMap
with WeakReference
keys, and do some extra work to implement removal of map entries for broken references, but that won't give you concurrent behaviour.
Using a java.util.WeakHashMap
won't give you either concurrency or identity hashing.
You could (in theory) wrap the key class in something that overrode the natural equals
and hashcode
methods. But that is most likely to be unusable.
I don't think it would be possible to do this by overriding methods in either ConcurrentHashMap
or IdentityHashMap
.
Maybe the only viable option would be to change the key classes equals
and hashcode
methods to be identity based. But that won't work for "built in" key types (especially final
ones) or for cases where you need value-based equals/hashcode in other parts of the application.
The Google Guava implementation appears the easiest way to go. One may initialize the required map with new MapMaker().weakKeys().makeMap()
and use just as one would use java.util.concurrent.ConcurrentHashMap
. See the apidoc for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With