素子としての地位を含まのArrayListのハッシュコード

ジョーカー:

我々は見つけることができるhashcodeのをlist、自身が含まれていますかelement

私は、これは悪い習慣である知っているが、これはインタビュアーが尋ねたものです。

私は、次のコードを実行したときにそれがスローされますStackOverflowError

public class Main {
    public static void main(String args[]) {
        ArrayList<ArrayList> a = new ArrayList();
        a.add(a);
        a.hashCode();
    }
}

今ここに私は2つの質問があります:

  1. なぜそこにいますかStackOverflowError
  2. それは、このようにハッシュコードを見つけることは可能ですか?
ホルガー:

適合のためのハッシュコードListの実装は、インターフェイスで指定されています

このリストのハッシュコード値を返します。リストのハッシュコードは、次の計算の結果であると定義されます。

 int hashCode = 1;
 for (E e : list)
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

この性を保証list1.equals(list2)ことを意味list1.hashCode()==list2.hashCode()任意の二つのリストのために、list1list2の一般規約によって要求されるように、Object.hashCode()

これは、(参照実装はまさにそのようになっていることを必要としない)List.hashCode(と同じように、ストリームのハッシュコードを計算するためにどのように代替のため)が、唯一自分自身を考え含むリストの正しいハッシュコード以下のための数値でx == 31 + xなければなりませんがtrue、他の言葉で、適合する数を計算することは不可能です。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=422489&siteId=1