将ArrayList放入HashMap后的Java StackOverflowError

时间:2012-04-22 09:31:44

标签: java arraylist hashmap stack-overflow

您好,有人可以向我解释为什么这段代码不起作用吗?

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

2 个答案:

答案 0 :(得分:13)

这是因为您正在尝试计算包含自身的ArrayList的哈希值。 ArrayList通过计算它引用的所有对象的哈希值来计算自己的哈希值。因为它引用自身,它会一遍又一遍地尝试计算自己的哈希值,导致堆栈溢出。

答案 1 :(得分:1)

首先:我不确定。但据我所知,HashMap会向密钥(在您的情况下是列表中)询问其HashCode。 HashMap将此HashCode存储在表中以更快地查找元素。这就是它被称为HashMap的原因。当要求List的HashCode时,它会尝试计算它。我认为这是问题所在。要计算HashCode,列表将询问每个包含的元素的HashCode。这就是你获得stackoverflow的地方。

1)看一下HashMap的put方法:

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