ConcurrentHashMap with weak keys and identity hash?
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.
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
withWeakReference
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
withWeakReference
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
andhashcode
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
orIdentityHashMap
.
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.