ジョーカー:
我々は見つけることができるhashcode
のをlist
、自身が含まれていますかelement
?
私は、これは悪い習慣である知っているが、これはインタビュアーが尋ねたものです。
私は、次のコードを実行したときにそれがスローされますStackOverflowError
:
public class Main {
public static void main(String args[]) {
ArrayList<ArrayList> a = new ArrayList();
a.add(a);
a.hashCode();
}
}
今ここに私は2つの質問があります:
- なぜそこにいますか
StackOverflowError
? - それは、このようにハッシュコードを見つけることは可能ですか?
ホルガー:
適合のためのハッシュコードList
の実装は、インターフェイスで指定されています。
このリストのハッシュコード値を返します。リストのハッシュコードは、次の計算の結果であると定義されます。
int hashCode = 1; for (E e : list) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
この性を保証
list1.equals(list2)
ことを意味list1.hashCode()==list2.hashCode()
任意の二つのリストのために、list1
とlist2
の一般規約によって要求されるように、Object.hashCode()
。
これは、(参照実装はまさにそのようになっていることを必要としない)List.hashCode(と同じように、ストリームのハッシュコードを計算するためにどのように代替のため)が、唯一自分自身を考え含むリストの正しいハッシュコード以下のための数値でx == 31 + x
なければなりませんがtrue
、他の言葉で、適合する数を計算することは不可能です。