2013-03-18 12 views
5

यहां नीचे उदाहरण में मैंने हैशसेट बनाया है जिसमें मैं तीन स्ट्रिंग मान एस 1, एस 2, एस 3 जोड़ रहा हूं हालांकि यह मुझे हैशसेट का आकार दिखाता है 1. क्यों?हैशसेट आकार समस्या

public static void main(String args[]) 
{ 
    String s1="abc"; 
    String s2=new String("abc"); 
    String s3="abc"; 
    Set setdemo=new HashSet(); 
    setdemo.add(s1); 
    setdemo.add(s2); 
    setdemo.add(s3); 

    System.out.println("s1 hashcode -:"+ System.identityHashCode(s1)); 
    System.out.println("s2 hashcode -:"+ System.identityHashCode(s2)); 
    System.out.println("s3 hashcode -:"+ System.identityHashCode(s3)); 
    System.out.println("Set size is -:"+setdemo.size()); 
} 

उत्पादन:

s1 hashcode -:17523401 
s2 hashcode -:8567361 
s3 hashcode -:17523401 
Set size is -:1 
+1

स्ट्रिंग समानता ओवरराइड बराबर() विधि के माध्यम से परीक्षण किया जाता है। वह विधि स्ट्रिंग की सामग्री को ध्यान में रखती है। यही कारण है कि एस 1! = एस 2, एस 2 सेट में नहीं होगा। s1.equals (एस 2) सच देता है। – Thihara

उत्तर

4

सेट डुप्लिकेट अनुमति नहीं है। जैसे तारों को पूल में रखा जाता है, वे सभी एक ही उदाहरण को इंगित करते हैं।

+2

वे सभी एक ही उदाहरण को इंगित नहीं करते हैं, क्योंकि स्ट्रिंग एस 2 को स्ट्रिंग पूल में नहीं रखा जाता है। – ghdalum

+0

@ghdalum सही सुधांशु है जो वे एक ही उदाहरण पर इंगित नहीं करते हैं। एस 2 एक नया उदाहरण है, यहां तक ​​कि हैकोड ओ/पी भी यही कहता है। – amod

0

क्योंकि हैशसेट में केवल अनन्य प्रविष्टियां सहेजी जाती हैं। यहाँ "abc" जोड़ा गया है 3 बार तो केवल स्ट्रिंग एबीसी भी आप हालांकि सहेजा जाएगा यह बार

2

Duplicate की संख्या एक बराबर हैश कोड होने, और जब समानता के लिए परीक्षण किया true लौटने के रूप में पहचान की है जोड़ें।

आपके मामले में, सभी 3 Stringsरूप में पहचाने जाते डुप्लिकेट और के बाद से Set डुप्लिकेट समाप्त, आकार आपके मामले में 1 है।

0

ए हैशसेट समान वस्तुओं के गुणकों को संग्रहीत नहीं करता है - यह एक "सेट" है। अपाचे कॉमन्स कलेक्शन या गुवा से उदाहरण के लिए आपको मल्टीसेट (जिसे बैग के नाम से भी जाना जाता है) कार्यान्वयन का उपयोग करना चाहिए - ये स्टोर आपके द्वारा जोड़े गए प्रतियों की संख्या भी है।

0

HashSet.add

, अगर सेट e2 ऐसी है कि (e==null ? e2==null : e.equals(e2))

तो कोई तत्व शामिल इस सेट करने के लिए निर्दिष्ट तत्व e कहते दौरान ऊपर संचालन जोड़ें:

s2.equals(s1) रिटर्न true, s2 जोड़ा नहीं गया है।

s3.equals(s1) रिटर्न true, s3setdemo में भी जोड़ा नहीं जाता है।

0

प्रत्येक स्ट्रिंग में हैश() फ़ंक्शन द्वारा समान हैशकोड लौटाया जा रहा है। और सेट डुप्लिकेट की अनुमति नहीं देता है, यह निश्चित रूप से उस स्थिति पर पिछले मान को ओवरराइट करेगा।

s1.equals(s2) 
s2.equals(s3) 

इसके String वर्ग के लिए

0

चेक उत्पादन विधि है जो क्योंकि HashSet का उपयोग करता है की पहचान करने के लिए कि क्या वस्तुओं एक ही हैं या नहीं करने के लिए विधि के बराबर होती है आप बार-बार एक ही वस्तु को जोड़ने के लिए अनुमति नहीं दे रहा बराबर होती है।

0

जब भी हम स्ट्रिंग क्लास का ऑब्जेक्ट बनाते हैं, तो यह जांचता है कि क्या किसी अन्य स्ट्रिंग में मान पहले ही संग्रहीत है या नहीं।

तरह
String s1 = "hello"; 
String s2 = "hello"; 

इस मामले में, यह एस 1 और एस 2 के लिए दो मेमोरी स्थानों, लेकिन केवल एक का आवंटन नहीं होंगे। जब हम .equals() ऑपरेटिंग का उपयोग करके जांचते हैं, तो यह स्मृति स्थान के लिए जांच करता है जो समान होता है। में:

setdemo.add(s1); 
setdemo.add(s1); 
setdemo.add(s1); 

हम तीन स्मृति स्थानों (सरल शब्दों में) बना रहे हैं तथा लेकिन HashSet के आकार है जब HashSet आंतरिक रूप से चेक (फिर सरल शब्दों में) .equals के लिए, यह यह एक ही स्मृति स्थान और इसलिए बताता है 1.

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