5

こんにちは、誰かが私にこのコードのブロックが機能しない理由を説明できますか?

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

2 に答える 2

13

ArrayListこれは、それ自体を含むのハッシュを計算しようとしているために発生します。ArrayList参照するすべてのオブジェクトのハッシュを計算することにより、独自のハッシュを計算します。自身を参照しているため、自身のハッシュを何度も計算しようとし、スタックオーバーフローを引き起こします。

于 2012-04-22T09:35:46.910 に答える
1

まず第一に:わかりません。しかし、私が知る限り、HashMapはキー(あなたの場合はリスト)にHashCodeを要求しますか?HashMapは、このHashCodeをテーブルに格納して、要素をより速く検索します。それがHashMapと呼ばれる理由です。リストがHashCodeを要求されると、リストはそれを計算しようとします。そして、ここに問題があると思います。HashCodeを計算するために、リストは含まれているすべての要素にHashCodeを要求します。そして、これはあなたがスタックオーバーフローを得るポイントです。

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

于 2012-04-22T09:40:53.083 に答える