2013-04-29 11 views
11

मैं HashMapHashSet से तेज़ क्यों कारण पढ़ रहा/शोध कर रहा हूं।हैश मैप हैशसेट से तेज़ क्यों है?

मैं काफी निम्नलिखित बयानों समझ नहीं कर रहा हूँ: क्योंकि मूल्यों एक अद्वितीय कुंजी के लिए जुड़े हुए हैं

  1. HashMapHashSet से तेज है।

  2. HashSet में, सदस्य ऑब्जेक्ट का उपयोग हैशकोड मान की गणना के लिए किया जाता है जो दो ऑब्जेक्ट्स के लिए समान हो सकता है ताकि equals() विधि समानता की जांच के लिए उपयोग की जा सके। यदि यह false देता है, तो इसका मतलब है कि दो ऑब्जेक्ट अलग हैं। HashMap में, हैशकोड मान की गणना मुख्य वस्तु का उपयोग करके की जाती है।

  3. HashMap हैशकोड मान की गणना मुख्य वस्तु का उपयोग करके की जाती है। यहां, सदस्य ऑब्जेक्ट का उपयोग हैशकोड की गणना करने के लिए किया जाता है, जो दो ऑब्जेक्ट्स के लिए समान हो सकता है, इसलिए equals() विधि समानता की जांच के लिए उपयोग की जाती है। यदि यह false देता है, तो इसका मतलब है कि दो ऑब्जेक्ट अलग हैं।

मेरे सवाल का निष्कर्ष करने के लिए:

  1. मैंने सोचा था कि HashMap और HashSet उसी तरह से hashCode गणना। वे अलग क्यों हैं?

  2. क्या आप एक ठोस उदाहरण प्रदान कर सकते हैं कि HashSet और HashMap हैशकोड को अलग-अलग गणना कर रहा है?

  3. मुझे पता है कि "मुख्य वस्तु" क्या है, लेकिन "सदस्य वस्तु" का क्या अर्थ है?

  4. HashMapHashSet, और तेज़ी से वही काम कर सकता है। हमें HashSet क्यों चाहिए? उदाहरण:

    HashMap <Object1, Boolean>= new HashMap<Object1, boolean>(); 
    map.put("obj1",true); => exist 
    map.get("obj1"); =>if null = not exist, else exist 
    
+3

आपको 'मानचित्र' और 'सेट' के बीच के अंतर के बारे में पढ़ना चाहिए। वे 'संग्रह' के दो अलग-अलग प्रकार हैं। एक बार ऐसा करने के बाद, यह स्पष्ट होना चाहिए कि मानचित्र से एक विशिष्ट ऑब्जेक्ट प्राप्त करना एक सेट से तेज़ क्यों है। – Magnilex

+0

हैशसेट हैश मैप पर बनाया गया है। और सेट विशिष्टता के लिए प्रयोग किया जाता है। यह नोटा कुंजी मूल्य जोड़ी संग्रह है। –

+0

हां। मुझे पता है कि वे विभिन्न इंटरफेस लागू करते हैं। लेकिन कुछ लोग कहते हैं कि हैशसेट बैकएंड में हैशपैप का उपयोग कर रहा है। यदि यह सच है, हैशपैप की तुलना में हैशसेट धीमा क्यों होगा? – runcode

उत्तर

18

प्रदर्शन:

आप HashSet (कम से कम JDK 6, 7 और 8), उसका आंतरिक HashMap का उपयोग करता है के स्रोत कोड को देखो, तो यह मूल रूप वास्तव में होता है, तो नमूना कोड के साथ आप क्या कर रहे हैं।

इसलिए, यदि आपको सेट कार्यान्वयन की आवश्यकता है, तो यदि आपको मानचित्र - हैश मैप की आवश्यकता है, तो आप हैशसेट का उपयोग करें। हैशसेट के बजाय हैश मैप का उपयोग करने वाले कोड में हैशसेट का उपयोग करने के समान ही प्रदर्शन होगा।

सही संग्रह का चयन

मानचित्र - मूल्यों के नक्शे कुंजियों (साहचर्य सरणी) - http://en.wikipedia.org/wiki/Associative_array

सेट - एक संग्रह जिसमें कोई डुप्लिकेट तत्व नहीं हैं - http://en.wikipedia.org/wiki/Set_(computer_science)

यदि केवल एक चीज जिसकी आपको आवश्यकता है, यह जांचना है कि कोई तत्व मौजूद है या नहीं - सेट का उपयोग करें।आपका कोड क्लीनर और दूसरों के लिए अधिक समझदार होगा।

यदि आपको अपने तत्वों के लिए कुछ डेटा स्टोर करने की आवश्यकता है - मानचित्र का उपयोग करें।

+2

क्या डेनिस ने कहा। साथ ही, आप Collections.newSetFromMap का उपयोग करके किसी भी मानचित्र को सेट के साथ लपेट सकते हैं। –

0

इनमें से कोई भी जवाब वास्तव में क्यों समझाता है हैश मैप हैशसेट से तेज़ है। उन्हें दोनों हैशकोड की गणना करना है, लेकिन हैश मैप की कुंजी की प्रकृति के बारे में सोचें - यह आम तौर पर एक साधारण स्ट्रिंग या यहां तक ​​कि एक संख्या है। उस के हैशकोड की गणना करना पूरे ऑब्जेक्ट की डिफ़ॉल्ट हैशकोड गणना से बहुत तेज है। यदि हैश मैप की कुंजी एक ही ऑब्जेक्ट थी जो हैशसेट में संग्रहीत है, तो प्रदर्शन में कोई वास्तविक अंतर नहीं होगा। अंतर हैशैप की कुंजी किस प्रकार की वस्तु है।

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