【问题标题】:Java StackOverflowError after putting ArrayList to HashMap将 ArrayList 放入 HashMap 后的 Java StackOverflowError
【发布时间】:2012-05-03 06:05:08
【问题描述】:

你好,谁能解释一下为什么这段代码不起作用?

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

【问题讨论】:

标签: java arraylist hashmap stack-overflow


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先:我不确定。但据我所知,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(ArrayList的超类)的hashCode()方法:

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

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 2013-05-29
      • 2013-10-31
      • 1970-01-01
      • 2016-02-20
      • 2015-03-08
      • 2011-04-18
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多