2012-04-22 14 views
5

हैलो, क्या कोई मुझे बता सकता है कि कोड का यह ब्लॉक क्यों काम नहीं करता है?जावा स्टैक ओवरव्लो एररलिस्ट को हैश मैप

ArrayList<Object> list = new ArrayList<Object>(); 
list.add(list); 

HashMap<Object, Integer> map = new HashMap<Object, Integer>(); 
map.put(list, 1); 

मैप करने के बाद सूची में, यह StackOverFlowError फेंकता है।

मुझे पता है कि यह कोड कोई समझ नहीं आता है, मैं सिर्फ यह जानना चाहता हूं कि यह क्यों काम नहीं कर रहा है।

धन्यवाद!

संपादित करें:

स्टैकट्रेस: ​​

Exception in thread "main" java.lang.StackOverflowError 
    at java.util.ArrayList.get(Unknown Source) 
    at java.util.AbstractList$Itr.next(Unknown Source) 
    at java.util.AbstractList.hashCode(Unknown Source) 
    at java.util.AbstractList.hashCode(Unknown Source) 
    ... 
+0

कृपया –

+7

'list.add (सूची) अपवाद का स्टैकट्रैक पेस्ट करें; 'मूल कारण हो सकता है। –

+0

कृपया निम्न लिंक देखें http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html –

उत्तर

13

यह इसलिए होता है क्योंकि आप एक ArrayList जो अपने आप में शामिल की हैश की गणना करने के प्रयास कर रहे हैं। ArrayList संदर्भित सभी ऑब्जेक्ट्स के हैंश की गणना करके अपने हैश की गणना करता है। जैसा कि यह स्वयं संदर्भित करता है, यह अपने स्वयं के हैश की गणना करने की कोशिश करेगा और फिर से स्टैक ओवरफ़्लो का कारण बन जाएगा।

1

सबसे पहले: मुझे यकीन नहीं है। लेकिन जहां तक ​​मुझे पता है, हैश मैप अपने हैशकोड के लिए कुंजी (आपके मामले में सूची) पूछेगा। तत्वों को तेज़ी से ढूंढने के लिए हैश मैप इस हैशकोड को एक टेबल में संग्रहीत करता है। यही कारण है कि इसे हैश मैप कहा जाता है। जब सूची को हैशकोड के लिए कहा जाता है, तो यह इसकी गणना करने की कोशिश करेगा। और मुझे लगता है कि यह समस्या है। हैशकोड की गणना करने के लिए, सूची प्रत्येक हैड तत्व को अपने हैशकोड के लिए पूछेगी। और यह वह बिंदु है जहां आपको स्टैक ओवरफ्लो मिलता है।

1) HashMap का पुट विधि पर एक नज़र डालें:

http://www.docjar.com/html/api/java/util/HashMap.java.html

2) फिर() AbstractList की विधि hashCode() पर एक नज़र ArrayList के सुपर वर्ग ले:

http://www.docjar.com/html/api/java/util/AbstractList.java.html