2016-02-29 11 views
12

ArrayList की मेरी समझ के अनुसार, डिफ़ॉल्ट क्षमता 10 है और जब यह 10 से परे होती है, यह इतने पर नई क्षमता और के साथ एक नई वस्तु ..क्यों hashCode() एक ArrayList परिवर्तन की हर बार जब आप एक नए तत्व जोड़ता है?

जिज्ञासा से बाहर

तो पैदा करेगा, मैं जाँच करने के लिए कार्यक्रम निम्नलिखित टाइप ArrayList वस्तु के लिए hashcode():

public class TestCoreJava { 

    public static void main(String [] args){ 

     ArrayList al = new ArrayList(); 

     for(int i=0;i<15;i++){ 

      al.add("Temp"+i); 
      System.out.println("Hashcode for "+i+" element "+al.hashCode()); 
     } 
    } 
} 

उपरोक्त परिदृश्य के अनुसार, जब मैं ArrayList के लिए प्रारंभिक क्षमता की स्थापना नहीं कर रहा हूँ डिफ़ॉल्ट होगा 10 तो 11 वीं तत्व जोड़ते समय, यह एक नई वस्तु बनाने जाएगा और के लिए क्षमता में वृद्धि ArrayList

जब मैं ArrayList वस्तु के लिए hashCode प्रिंट, यह एक नई hashcode() हर बार दे रहा है।

के बाद ओ/पी है:

Hashcode for 0 element 80692955 
Hashcode for 1 element -1712792766 
Hashcode for 2 element -1476275268 
Hashcode for 3 element 1560799875 
Hashcode for 4 element 1220848797 
Hashcode for 5 element -727700028 
Hashcode for 6 element -1003171458 
Hashcode for 7 element -952851195 
Hashcode for 8 element 607076959 
Hashcode for 9 element 1720209478 
Hashcode for 10 element -6600307 
Hashcode for 11 element -1998096089 
Hashcode for 12 element 690044110 
Hashcode for 13 element -1876955640 
Hashcode for 14 element 150430735 

डिफ़ॉल्ट क्षमता की अवधारणा के अनुसार, 10 वीं तत्व जब तक यह एक ही hashcode() मुद्रित किया जाना चाहिए था के रूप में कोई नई वस्तु उस समय तक बनाने की आवश्यकता है, लेकिन यह है मामला नहीं। ArrayList की

+0

'hashCode()' 'बराबर()' जो इंगित करता है कि विभिन्न तत्वों लेकिन एक ही क्षमता के साथ 2 सूचियों अलग हैश कोड लौटना चाहिए (जो वे करते हैं अगर आप स्रोतों को देखने) के – Thomas

+0

संभावित डुप्लिकेट से जुड़ा हुआ है [जावा में बराबर और हैशकोड ओवरराइड करते समय किन मुद्दों पर विचार किया जाना चाहिए?] (Http://stackoverflow.com/questions/27581/what-issues-should-be-Considered-when-overriding-equals-and-hashcode-in- जावा) – Raedwald

उत्तर

32

hashCode सभी ArrayList में संग्रहीत तत्वों की hashCode रों के एक समारोह है, इसलिए यह नहीं बदलता है जब क्षमता परिवर्तन, यह परिवर्तन जब भी आप जोड़ सकते हैं या एक तत्व हटाने या तत्वों में से एक उत्परिवर्तित एक तरीका है कि अपने hashCode बदल जाता है में।

:

public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 

Btw, इस सटीक कोड है कि List इंटरफ़ेस का hashCode() की जावाडोक में प्रकट होता है:

यहाँ जावा 8 कार्यान्वयन (यह वास्तव में AbstractList में लागू है) है पूर्णांक java.util.List.hashCode()

रिटर्न के लिए हैश कोड मूल्य यह सूची। एक सूची के हैश कोड निम्नलिखित गणना का परिणाम माना परिभाषित किया गया है:

int hashCode = 1; 
for (E e : list) 
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
+0

सही उत्तर में मुझे इंगित करने के लिए धन्यवाद एरान :) – suyash

4

List की hashCode कार्यान्वयन defined in terms of the hashCode of it's elements है। इसका मतलब यह है कि यह hashCodeचाहिए परिवर्तन जब इसकी सामग्री परिवर्तन है ArrayList एक अनुरूप List कार्यान्वयन होने के लिए।

अधिक आम तौर पर: परिवर्तनशील वस्तुओं के लिए, hashCode जब भी वे एक तरीका है कि उन्हें अपनी पिछली स्थिति में नहीं equal होगा में बदल बदलना चाहिए।

आपको लगता है कि यह default hashCodeObject का उपयोग करता है, जो मामला नहीं है।

साथ ही, भले ही ArrayListhashCode को लागू नहीं किया था, एक ArrayList के डिफ़ॉल्ट हैश कोड (भी identity hash code रूप में जाना) यदि आंतरिक सरणी फिर से आवंटित किया गया था परिवर्तन नहीं होता है, ArrayList वस्तु ही पहले जैसा रहता है, बस आंतरिक सरणी ऑब्जेक्ट (जिसे आपको सीधे पहुंच नहीं मिलती है) को एक नए से बदल दिया जाएगा।

2

इस के लिए विवरण the docs for hashCode

को देखकर पाया जा सकता है दो वस्तुओं बराबर (वस्तु) विधि के अनुसार बराबर हैं, तो दो वस्तुओं में से प्रत्येक पर hashCode विधि बुला ही उत्पादन होगा तो पूर्णांक परिणाम।

जब ArrayList की सामग्री बदलती है, तो यह अन्य वस्तुओं के बराबर बदलती है। Object के अनुबंध के इस हिस्से को पूरा करने के लिए, ArrayList या तो सामग्री के होने पर hashCode परिवर्तन होने की आवश्यकता है, या प्रत्येक ArrayList में hashCode है। इसे कुछ हद तक उपयोगी बनाने के लिए, उन्होंने स्पष्ट रूप से पूर्व के लिए चुना। इसे List's docs पर देखकर सत्यापित किया जा सकता है।

इस सूची के लिए हैश कोड मान देता है। एक सूची के हैश कोड निम्नलिखित गणना का परिणाम माना परिभाषित किया गया है:

int hashCode = 1; 
for (E e : list) 
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 

यह सुनिश्चित करता है कि list1.equals (List2) का तात्पर्य है कि list1.hashCode() == list2.hashCode() के लिए ऑब्जेक्ट.hashCode() के सामान्य अनुबंध द्वारा आवश्यक किसी भी दो सूचियों, सूची 1 और सूची 2, ।

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