Frage Java StackOverflowError, nachdem ArrayList zu HashMap hinzugefügt wurde


Hallo, kann mir jemand erklären, warum dieser Codeblock nicht funktioniert?

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

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

Nachdem ich die Liste auf die Karte gesetzt habe, wird StackOverFlowError ausgelöst.

Ich weiß, dass dieser Code keinen Sinn ergibt, ich will nur wissen, warum es nicht funktioniert.

Vielen Dank!

Bearbeiten:

Stapelverfolgung:

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)
    ...

5
2018-04-22 09:31


Ursprung


Antworten:


Es passiert, weil Sie versuchen, Hash von einem zu berechnen ArrayList was sich selbst enthält. ArrayList berechnet seinen eigenen Hashwert durch Berechnung von Hashwerten aller Objekte, auf die er verweist. Wenn es sich selbst referenziert, wird es versuchen, seinen eigenen Hash immer wieder zu berechnen, was den Stapelüberlauf verursacht.


13
2018-04-22 09:35



Zuallererst: Ich bin mir nicht sicher. Aber soweit ich weiß, fragt HashMap den Schlüssel (in Ihrem Fall die Liste) nach seinem HashCode. HashMap speichert diesen HashCode in einer Tabelle, um die Elemente schneller zu finden. Deshalb heißt es HashMap. Wenn die Liste nach ihrem HashCode gefragt wird, wird sie versuchen, sie zu berechnen. Und ich denke, hier ist das Problem. Um den HashCode zu berechnen, wird die Liste jedes enthaltene Element nach seinem HashCode fragen. Und das ist der Punkt, an dem Sie den Stackoverflow erhalten.

1) Werfen Sie einen Blick auf die Put-Methode von HashMap:

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

2) Sehen Sie sich dann die hashCode () Methode von AbstractList an (die Superklasse von ArrayList):

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


1
2018-04-22 09:40