2010-11-17 12 views
6

Mamy serwer Scala, który pobiera drzewo węzłów za pomocą buforów protokołów przez gniazdo i musimy dołączyć dodatkowe dane do każdego węzła.Guava MapMaker(). WeakKeys(). MakeMap() kontra WeakHashMap

W kontekście pojedynczego wątku i gdy zarówno drzewo węzłów, jak i powiązane dane będą miały usunięte silne referencje w tym samym czasie (z powodu wychodzenia z zakresu), czy istnieje jakikolwiek powód, aby używać programu Google Guava MapMaker z weakKeys () za pomocą WeakHashMap? Wygląda na to, że w programie MapMaker opłaca się dostęp synchroniczny, który nie jest w tym przypadku potrzebny.

Na marginesie, przydatne byłoby, gdyby program MapMaker dał dostęp do ustawień równoważności, aby można było wybrać równość odniesienia, ale nie dbać o słabe lub miękkie odniesienia.

Odpowiedz

6

Jedną istotną wadą do WeakHashMap jest to, że nie jest to "mapa tożsamości". Oznacza to, że używa on equals() i hashCode (zamiast == i identityHashCode) na klawiszach, co tak naprawdę nie ma sensu dla słabych klawiszy. Możesz obejść ten błąd, upewniając się, że klucze używają równości tożsamości w metodzie equals.

+0

Dzięki Laurence szybko zeskanowałem Javadoc i założyłem, że zostanie on zaimplementowany przy użyciu == i identityHashCode, ale bliższe czytanie pasuje do twojego opisu. –

+0

Ponadto można nadal używać java.util.HashMap i pisać niestandardowy ReferenceEquivalence , który zawiera pojedynczy T i używa == i identityHashCode? –

+0

Możesz, ale będziesz potrzebował czegoś, by usunąć martwe klucze z 'HashMap'. Na marginesie nie zweryfikowałem tego, patrząc na kod, ale zastanawiam się, czy usunięcie martwych kluczy/wartości jest częścią powodu, że 'MapMaker' używa' ConcurrentMap'. –