2012-04-22 13 views
5

Hola, ¿alguien puede explicarme por qué este bloque de código no funciona?Java StackOverflowError después de poner ArrayList en HashMap

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

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

Después de poner la lista en el mapa, arroja StackOverFlowError.

Sé que este código no tiene ningún sentido, solo quiero saber por qué no está funcionando.

Gracias!

Editar:

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

Por favor pegue el stacktrace de la excepción –

+7

'list.add (list);' podría ser la causa raíz. –

+0

Consulte el siguiente enlace http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html –

Respuesta

13

Esto sucede porque usted está tratando de calcular de hash de una ArrayList que contiene en sí. ArrayList calcula su propio hash calculando hashes de todos los objetos a los que hace referencia. Como se refiere a sí mismo, intentará calcular su propio hash una y otra vez causando el desbordamiento de la pila.

1

Antes que nada: no estoy seguro. Pero hasta donde yo sé, HashMap preguntará la clave (en su caso, la lista) por su HashCode. HashMap almacena este código Hash en una tabla para encontrar los elementos más rápido. Es por eso que se llama HashMap. Cuando se le pide a la Lista su HashCode, intentará calcularlo. Y creo que este es el problema. Para calcular HashCode, la lista le preguntará a cada elemento contenido por su HashCode. Y este es el punto donde obtienes el stackoverflow.

1) Tome una mirada en el método put de HashMap:

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

2) A continuación, echar un vistazo al método hashCode() de AbstractList (la super clase de ArrayList):

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