मैं सहमत हूं:
- O (1) की सामान्य परिशोधन जटिलता
- एक खराब
hashCode()कार्यान्वयन कई टकरावों का परिणाम हो सकता है, जिसका अर्थ है कि सबसे खराब स्थिति में प्रत्येक वस्तु एक ही बाल्टी में जाती है, इस प्रकार ओ ( एन ) यदि प्रत्येक बाल्टी एक द्वारा समर्थित है List।
- चूंकि जावा 8,
HashMapडायनेमिक रूप से प्रत्येक बकेट में इस्तेमाल किए गए नोड्स (लिंक्ड लिस्ट) को ट्रीनोड्स (लाल-काला पेड़ जब एक सूची 8 तत्वों से बड़ा हो जाता है) की जगह लेती है, जिसके परिणामस्वरूप ओ ( लॉगएन ) का सबसे खराब प्रदर्शन होता है ।
लेकिन, यह पूर्ण सत्य नहीं है यदि हम 100% सटीक होना चाहते हैं। कार्यान्वयन hashCode()और कुंजी के प्रकार Object(अपरिवर्तनीय / कैशेड या एक संग्रह होने के नाते) भी सख्त शब्दों में वास्तविक जटिलता को प्रभावित कर सकते हैं।
आइए निम्नलिखित तीन मामलों को मानें:
HashMap<Integer, V>
HashMap<String, V>
HashMap<List<E>, V>
क्या उनमें एक ही जटिलता है? ठीक है, 1 की परिशोधित जटिलता, उम्मीद के मुताबिक, ओ (1) है। लेकिन, बाकी के लिए, हमें hashCode()लुकअप तत्व की गणना करने की आवश्यकता है , जिसका अर्थ है कि हमें अपने एल्गोरिथ्म में सरणियों और सूचियों का पता लगाना होगा।
मान लेते हैं कि उपरोक्त सभी सरणियों / सूचियों का आकार k है । फिर, HashMap<String, V>और HashMap<List<E>, V>O (k) परिमित जटिलता होगी और इसी तरह, Java8 में O ( k + logN ) सबसे खराब स्थिति है।
* ध्यान दें कि Stringकुंजी का उपयोग करना अधिक जटिल मामला है, क्योंकि यह अपरिवर्तनीय है और जावा hashCode()एक निजी चर में परिणाम देता है hash, इसलिए यह केवल एक बार गणना की जाती है।
/** Cache the hash code for the string */
private int hash; // Default to 0
लेकिन, उपरोक्त भी अपना सबसे खराब मामला है, क्योंकि कंप्यूटिंग से पहले जावा का String.hashCode()कार्यान्वयन जाँच कर रहा है । लेकिन हे, ऐसे गैर-रिक्त स्ट्रिंग्स हैं जो शून्य का उत्पादन करते हैं, जैसे कि "f5a5a608", यहां देखें , जिसमें संस्मरण सहायक नहीं हो सकता है।hash == 0hashCodehashcode