質問: new ArrayList(); strList2.add("hoge"); strList2.add("fuga"); System.out.println(Integer.toHexString(strList1.hashCode())); System.out.println(Integer.toHexString(strList2.hashCode())); ``` 結果 arrayStr1:[Ljava.lang.String;@15db9742 arrayStr2:[Ljava.lang.String;@6d06d69c strList1:61db625 strList2:61db625 リストは同じですが、配列のhashコードが異なります。 なぜ異なるのでしょうか? また、変数名を変えてもhashコードが変わりませんでした。 hashコードの生成のルールについてもご教示いただきたいです。
回答: > > なぜ異なるのでしょうか? > > > Javaの場合、配列はインスタンスの一致しか見ないので、中身が同じでも`equals`で**一致しません**(JPCERT/CC)。ということで、「`equals`で一致しないものは`hashCode`も別のものにすべき」というルールに従って、`hashCode`も別なものが割り振られます。 > > また、変数名を変えてもhashコードが変わりませんでした。 > > > `hashCode`は**インスタンス**に結びついたものなので、どの変数に入れようが同じインスタンスであれば同じ値です。 > > hashコードの生成のルールについてもご教示いただきたいです。 > > > `hashCode`を使う側としては、具体的なルールはむしろ**考えてはいけません**(何らかの事情で、生成される`hashCode`の具体的な値が変化することも考えられます)。`hashCode`の一般契約(Oracle)が成立していれば動くようにプログラムを書くべきで、使う側がそれ以上の詳細に立ち入るのは不適切です。 * `equals`で比較して等しくなるオブジェクトは、同じ`hashCode`を返す * `equals`での比較状況が変化しない場合、`hashCode`も変化しない * `equals`で比較して等しくならない場合、違う`hashCode`を返すようにしたほうが効率化する