2012-04-22 18 views
5

Ciao, qualcuno può spiegarmi perché questo blocco di codice non funziona?Java StackOverflowError dopo aver inserito ArrayList in HashMap

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

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

Dopo aver inserito l'elenco sulla mappa, genera StackOverFlowError.

So che questo codice non ha alcun senso, voglio solo sapere perché non funziona.

Grazie!

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

Si prega di incollare lo stacktrace dell'eccezione –

+7

'list.add (elenco);' potrebbe essere la causa principale. –

+0

Vedere il seguente link http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html –

risposta

13

Succede perché si sta cercando di calcolare hash di un ArrayList che si contiene. ArrayList calcola il proprio hash calcolando gli hash di tutti gli oggetti a cui fa riferimento. Poiché fa riferimento a se stesso, proverà a calcolare il proprio hash più e più volte causando l'overflow dello stack.

1

Prima di tutto: non ne sono sicuro. Ma per quanto ne so, HashMap chiederà la chiave (nel tuo caso la lista) per il suo HashCode. HashMap memorizza questo HashCode in una tabella per trovare gli elementi più velocemente. Ecco perché si chiama HashMap. Quando viene chiesto a List il suo codice hash, proverà a calcolarlo. E penso che questo sia il problema Per calcolare il codice hash, l'elenco chiederà ogni elemento contenuto per il suo codice hash. E questo è il punto in cui ottieni lo stackoverflow.

1) Date un'occhiata al metodo put di HashMap:

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

2) Dai un'occhiata al metodo hashCode() del AbstractList (la classe eccellente di ArrayList):

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

Problemi correlati