2013-08-06 7 views
20

मैं एक HashSet <>() प्यार और इस उत्सुकता का उपयोग करते हुए डिफ़ॉल्ट निर्माता के साथ इस आरंभ:हैशसेट <> (0) शून्य से क्यों प्रारंभ करें?

Set<Users> users = new HashSet<>(0); 
:

Set<Users> users = new HashSet<>(); 

अब, मुझे स्वचालित सेम निर्माता (JBoss उपकरण) इस रूप में आरंभ

क्यों शून्य? एपीआई मुझे बताती है कि यह प्रारंभिक क्षमता है, लेकिन इसे शून्य पर रखने का क्या फायदा है? क्या यह सलाह दी जाती है?

उत्तर

21

default initial capacity is 16, इसलिए 0 में गुजरकर आप सेट में कुछ भी नहीं डालते हैं तो आप स्मृति के कुछ बाइट्स बचा सकते हैं।

इसके अलावा कोई वास्तविक लाभ नहीं है; जब आप 0 पास करते हैं तो सेट 1 की क्षमता के साथ बनाया जाता है और जैसे ही आप कुछ जोड़ते हैं, उसे आकार बदलना होगा।

+0

@ पीटर Lawrey न्यूनतम भी 16 है? तो 0 काम नहीं करना चाहिए? – Aquillo

+0

@ पीटर Lawrey, कैसे आते हैं? 2 नहीं है? –

+0

+1 क्षमा करें, इस कन्स्ट्रक्टर के लिए, न्यूनतम 1. –

3

If you see docs

कुछ सुराग नहीं है।

पुनरावृत्ति इस सेट से अधिक समय HashSet उदाहरण के आकार (तत्वों की संख्या) के साथ साथ समर्थन HashMap उदाहरण के "क्षमता" (बकेट की संख्या) की राशि के लिए आनुपातिक की आवश्यकता है। इस प्रकार, यह बहुत महत्वपूर्ण है कि प्रारंभिक क्षमता बहुत अधिक (या लोड फैक्टर बहुत कम) सेट न करें यदि पुनरावृत्ति प्रदर्शन महत्वपूर्ण है।

6

HashSet उपयोग HashMap दुकान डेटा:

public HashSet(int initialCapacity) { 
map = new HashMap<E,Object>(initialCapacity); 
} 

जबकि initialCapacity = 0,

public HashMap(int initialCapacity, float loadFactor) { 
    .... 
    // Find a power of 2 >= initialCapacity 
    int capacity = 1; 
    while (capacity < initialCapacity) 
     capacity <<= 1; 
} 

HashMap क्षमता 1 है।

लेकिन अगर उपयोग डिफ़ॉल्ट निर्माता:

public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

HashMap क्षमता 16*0.75 है।

तो, new HashSet<>(0) init जब कुछ memroy बचाओ।

5

यह इसे न्यूनतम पर सेट करेगा।

अधिकतर संभावना कोड विश्लेषणकर्ताओं को बंद करने के लिए उपयोग की जाती है जो शिकायत कर सकती हैं कि आपने संग्रह के लिए प्रारंभिक क्षमता निर्धारित नहीं की है। इसे 0 पर सेट करके आप इसे न्यूनतम पर सेट करें।

यह अनुकूलन का अधिक नहीं है क्योंकि जैसे ही आप कोई प्रविष्टि जोड़ते हैं, 0.7 का लोड कारक क्षमता 2 बना देगा, प्रक्रिया में Map.Entry[] को पुन: प्रयास करेगा।

0

हैश मैप का प्रारंभिक लोड कारक 16 है। जब हैश मैप 12 रिकॉर्ड्स का डेटा रखता है जो प्रारंभिक आकार का 75% है। तो हैश मैप इसका आकार बढ़ाता है।

तो यहां हम कन्स्ट्रक्टर में इसे पास करके प्रारंभिक क्षमता को 0 के रूप में सेट करते हैं।

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