2010-11-17 10 views
6

हमारे पास एक स्कैला सर्वर है जो सॉकेट पर प्रोटोकॉल बफर का उपयोग करके नोड पेड़ प्राप्त कर रहा है और हमें प्रत्येक नोड को अतिरिक्त डेटा संलग्न करने की आवश्यकता है।गुवा मैपमेकर()। कमजोरकेस()। मेकमैप() बनाम वीक हैशैप

एक थ्रेडेड संदर्भ में और जब दोनों नोड पेड़ और संबंधित डेटा के साथ एक ही समय में उनके मजबूत संदर्भ हटाए जाएंगे (दायरे से बाहर निकलने के कारण), क्या Google Guava के MapMaker को कमजोर के साथ उपयोग करने का कोई कारण है () WeakHashMap का उपयोग करने पर? ऐसा लगता है कि MapMaker के साथ, एक सिंक्रनाइज़ पहुंच के लिए भुगतान करता है, जिसकी आवश्यकता इस मामले में नहीं है।

एक तरफ के रूप में, यह उपयोगी होगा अगर मैपमेकर समकक्ष सेटिंग्स तक पहुंच प्रदान करे, तो कोई संदर्भ समानता चुन सकता है लेकिन कमजोर या मुलायम संदर्भों की परवाह नहीं करता है।

उत्तर

6

WeakHashMap पर एक महत्वपूर्ण नकारात्मक पक्ष यह है कि यह "पहचान मानचित्र" नहीं है। यही कारण है, यह कुंजी है, जो वास्तव में कमजोर चाबी के लिए मतलब नहीं है पर equals() और hashCode का उपयोग करता है (बजाय == और identityHashCode)। आप यह सुनिश्चित करके इस बग के आसपास काम कर सकते हैं कि आपकी चाबियां equals विधि में पहचान समानता का उपयोग करें।

+0

धन्यवाद लॉरेंस, मैंने जल्दी ही जावाडोक स्कैन किया और माना कि इसे == और पहचान हैशकोड का उपयोग करके कार्यान्वित किया जाएगा, लेकिन एक करीबी पढ़ने से आपके विवरण से मेल खाता है। –

+0

इसके अलावा, एक अभी भी java.util.HashMap का उपयोग करें और एक कस्टम ReferenceEquivalence है कि एक ही टी में शामिल है और का उपयोग करता है == और identityHashCode लिख सकता है? –

+0

आप कर सकते थे, लेकिन आपको 'हैश मैप' से मृत कुंजी को शुद्ध करने के लिए कुछ चाहिए। एक तरफ, मैंने कोड को देखकर इसे सत्यापित नहीं किया है, लेकिन मुझे आश्चर्य है कि मृत कुंजी/मानों को हटाने का कारण 'MapMaker'' ConcurrentMap' का उपयोग करता है। –

संबंधित मुद्दे