2012-04-22 20 views
5

こんにちは、このコードブロックがなぜ機能しないのか誰かが私に説明できますか?ArrayListをHashMapに入れた後のJava StackOverflowError

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

例外のスタックトレースを貼り付けてください。 –

+7

'list.add(list);'が原因である可能性があります。 –

+0

次のリンクを参照してください。http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html –

答えて

13

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

1

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

:次にAbstractList(ArrayListののスーパークラス)ののhashCode()メソッドを見てみましょう)

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

2:

1)のHashMapのputメソッドを見てみましょう

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