ConcurrentHashMap. newKeySet () बनाम संग्रह. newSetFromMap ()-जावा, सेट, जावा-8, जावा. util. समसामयिक, ConcurrentHashMap

जावा 8 ने एक समवर्ती प्राप्त करने के लिए नया तरीका पेश किया Set कार्यान्वयन

// Pre-Java-8 way to create a concurrent set
Set<String> oldStyle = Collections.newSetFromMap(new ConcurrentHashMap<>());
// New method in Java 8
Set<String> newStyle = ConcurrentHashMap.newKeySet();

क्या नई विधि पसंद करने का कोई कारण है?

कोई फायदे / नुकसान?

उत्तर:

जवाब के लिए 5 № 1

ConcurrentHashMap.newKeySet() संकेत के एक स्तर को हटाते हुए कुछ हद तक अधिक कुशल होना चाहिए। Collections.newSetFromMap(map) ज्यादातर परिचालन को पुनर्निर्देशित करने पर आधारित है map.keySet(), परंतु ConcurrentHashMap.newKeySet() बहुत करीब है map.keySet() खुद (केवल जोड़ों के समर्थन के साथ)।

कार्यक्षमता के रूप में, मुझे कोई फर्क नहीं पड़ता।


जवाब के लिए 12 № 2

ConcurrentHashMap.newKeySet() यह एक ऐसी सुविधा का हिस्सा है जो बहुत व्यापक है Collections.newSetFromMap(new ConcurrentHashMap<>())

यदि आप इस उदाहरण को देखते हैं तो अंतर स्पष्ट हो जाता है:

Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");

मैपिंग के बजाय Boolean.TRUE अब आप मूल्य जोड़ रहे हैं "hello" जब एक नया मूल्य जोड़ते हैं Set

यही कारण है कि लौटा Setएस प्रकार है ConcurrentHashMap.KeySetView। इस प्रकार के लिए अतिरिक्त विधियां हैं बैकिंग मानचित्र के लिए पूछना साथ ही साथ नई कुंजी जोड़ने के दौरान कौन सा मान उपयोग किया जाएगा


इसलिए जबकि ConcurrentHashMap.newKeySet() ऐसा करने जैसा दिखता है Collections.newSetFromMap(new ConcurrentHashMap<>()), अर्थपूर्ण अंतर है कि उत्तरार्द्ध कहता है कि आपको बाद में मानचित्र का उपयोग नहीं करना चाहिए, जबकि पूर्व एक विशेषता का हिस्सा है जिसे मानचित्र के साथ संवाद करने के लिए डिज़ाइन किया गया है।

देख Collections.newSetFromMap:

इस विधि को लागू किए जाने पर निर्दिष्ट नक्शा खाली होना चाहिए, और इस विधि के रिटर्न के बाद सीधे पहुंचा नहीं जाना चाहिए।

वास्तव में, यह भी निर्दिष्ट नहीं है Collections.newSetFromMap उपयोग होगा Boolean.TRUE अतिरिक्त मूल्यों के लिए- आपको वैसे भी इससे निपटना नहीं चाहिए ...


जब आप पास करना चाहते हैं तो यह भी उपयोगी हो सकता है Set कोड जो स्पष्ट रूप से अनुरोध करता है ConcurrentHashMap.KeySetView


यदि आप संकलन-समय प्रकार का उपयोग कर परिणाम का उपयोग कर रहे हैं Set केवल, अभी भी संभावना है कि कोड प्राप्त करता है Set उपयोग होगा instanceof/ प्रकार का परिणाम पता लगाने के लिए कास्ट करता है ConcurrentHashMap.newKeySet() एक द्वारा समर्थित है ConcurrentHashMap जबकि परिणाम Collections.newSetFromMap आपको नहीं बताऊंगा दूसरी ओर, यह कोड को बैकिंग मैप के साथ अनजान चीजों को करने की अनुमति देता है ...


संबंधित सवाल
सबसे लोकप्रिय