java असीमित लूप जब कुंजीपटल हैशमैप में कई बार उपयोग करते हैं




hash hashmap (4)

HashMap एक अनंत लूप में गिर जाता है

मैं समझ नहीं पा रहा हूं कि HashMap त्रुटि क्यों फेंकता है जब एक ही कुंजी कई बार उपयोग की जाती है

कोड:

import java.util.HashMap;

public class Test {
    public static void main(String[] args) {
        HashMap hm = new HashMap();

        hm.put(hm, "1");
        hm.put(hm, "2");
    }
} 

त्रुटि:

धागा "मुख्य" java.lang.StackOverflowError में अपवाद


एक कुंजी के रूप में खुद को Map जोड़ना संभव नहीं है जवाडोक से :

इस निषेध का एक विशेष मामला यह है कि किसी मानचित्र के लिए खुद को एक कुंजी के रूप में शामिल करने के लिए यह अनुमति नहीं है

समस्या यह है कि आप कुंजी के रूप में उपयोग नहीं कर रहे हैं एक मानक वस्तु (किसी भी ऑब्जेक्ट के साथ अच्छी तरह से परिभाषित equals और hashCode विधियां, जो स्वयं नक्शा नहीं है), लेकिन खुद नक्शा।

समस्या यह है कि कैसे hashCode के HashMap की गणना की जाती है:

public int hashCode() {
   int h = 0;
   Iterator<Entry<K,V>> i = entrySet().iterator();
   while (i.hasNext())
       h += i.next().hashCode();
   return h;
}

जैसा कि आप देख सकते हैं, नक्शे के हैशोडोड की गणना करने के लिए, यह मानचित्र के सभी तत्वों पर पुनरावृत्त करता है। और प्रत्येक तत्व के लिए, यह हैशोडे की गणना करता है क्योंकि नक्शा का एकमात्र तत्व मुख्य रूप से मानचित्र है, यह पुनरावर्ती का एक स्रोत बन जाता है।

नक्शा को अन्य वस्तु के साथ बदलकर जो कुंजी के रूप में इस्तेमाल किया जा सकता है (अच्छी तरह से परिभाषित equals और hashCode ) काम करेगा:

import java.util.HashMap;

 public class Test {
   public static void main(String[] args) {
     HashMap hm = new HashMap();

     String key = "k1";
     hm.put(key, "1");
     hm.put(key, "2");
   }
} 

आप उसी ऑब्जेक्ट नेम को एक कुंजी के रूप में उपयोग कर रहे हैं, इसलिए यह अनंत लूप है।

तो यह स्टैक अतिप्रवाह है


समस्या यह नहीं है कि हैश मैप दो बार दर्ज की गई "एक ही कुंजी" के लिए स्टैक को उड़ा देता है, लेकिन क्योंकि मैप की अपनी खास पसंद है। आप अपने आप को हैश मैप जोड़ रहे हैं

बेहतर समझने के लिए - मैप अनुबंध का हिस्सा यह है कि चाबियाँ उन तरीकों से बदलना नहीं चाहिए जो उनके बराबर (या उस बात के लिए हैशकोड) तरीकों को प्रभावित करती हैं

जब आप एक कुंजी के रूप में अपने आप में नक्शा जोड़ते हैं, तो आपने कुंजी (मैप) को उस तरीके से बदल दिया था जो कि जब आप पहली बार नक्शे को जोड़ते हैं तो अलग हैशकोड लौटाते हैं।

अधिक जानकारी के लिए यह नक्शा इंटरफ़ेस के लिए जेडीके डॉक से है:

नोट: म्यूटिव ऑब्जेक्ट्स मैप कुंजी के रूप में उपयोग किए जाने पर महान देखभाल का प्रयोग किया जाना चाहिए। यदि किसी ऑब्जेक्ट का मान किसी तरह से बदल जाता है, तो उस मानचित्र के व्यवहार को निर्दिष्ट नहीं किया जाता है, जो उस वस्तु के बराबर है, जबकि ऑब्जेक्ट नक्शे में एक कुंजी है। इस निषेध का एक विशेष मामला यह है कि किसी मानचित्र के लिए खुद को एक कुंजी के रूप में शामिल करने के लिए यह अनुमति नहीं है हालांकि किसी मैप के लिए खुद को वैल्यू के रूप में रखने के लिए अनुमति है, लेकिन सावधानी बरतने की सलाह दी गई है: इस तरह के नक्शे पर बराबर और हैश कोड विधियां अब अच्छी तरह से परिभाषित नहीं हैं।


आप हीसमै स्वयं के रूप में उपयोग करते हैं -> इसका मतलब है कि पुनरावर्तन -> कोई निकास की स्थिति -> स्टैक ओवरफ्लो

बस एक चाबी (लंबी, स्ट्रिंग, ऑब्जेक्ट जो कुछ भी आप चाहते हैं) का उपयोग करें।

और हाँ, जैसा कि सीक एडो का सुझाव है, <> कोष्ठक के साथ प्रकार जोड़ते हैं।







stack-overflow