2012-04-22 23 views
5

Witam, czy ktoś może mi wyjaśnić, dlaczego ten blok kodu nie działa?Java StackOverflowError po wprowadzeniu ArrayList do HashMap

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

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

Po umieszczeniu listy w mapie, rzuca StackOverFlowError.

Wiem, że ten kod nie ma żadnego sensu, po prostu chcę wiedzieć, dlaczego to nie działa.

Dzięki!

Edit:

StackTrace:

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

Proszę wkleić stos śledzenia wyjątku –

+7

'list.add (lista);' może być główną przyczyną. –

+0

Zobacz poniższy link http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html –

Odpowiedz

13

Zdarza się, ponieważ starają się obliczyć hash z ArrayList która zawiera się. ArrayList oblicza własny skrót, obliczając wartości skrótów wszystkich obiektów, do których się odnosi. Jak sam się odwołuje, będzie próbował obliczać własny skrót, powodując przepełnienie stosu.

1

Po pierwsze: nie jestem pewien. Ale o ile mi wiadomo, HashMap poprosi klucz (w twoim przypadku listę) o jego kod HashCode. HashMap przechowuje ten HashCode w tabeli, aby szybciej znaleźć elementy. Dlatego nazywa się HashMap. Kiedy lista zostanie poproszona o swój HashCode, spróbuje ją obliczyć. I myślę, że tutaj jest problem. Aby obliczyć kod HashCode, lista wyświetli każdy zamknięty element dla swojego HashCode. I to jest punkt, w którym dostajesz stackoverflow.

1) Spójrz na metody put HashMap:

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

2) Następnie przyjrzeć się metodzie hashCode() z AbstractList (super klasa ArrayList):

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