Search code examples
javaconcurrencyweak-referencesconcurrenthashmap

ConcurrentHashMap with weak keys and identity hash?


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?


Solution

  • 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.