Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ConcurrentHashMap with weak keys and identity hash?

Tags:

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?

like image 254
r.v Avatar asked Mar 17 '13 01:03

r.v


2 Answers

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.

like image 118
Stephen C Avatar answered Sep 19 '22 21:09

Stephen C


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.

like image 28
r.v Avatar answered Sep 19 '22 21:09

r.v