Java でのハッシュの衝突解決は、連鎖に基づいていません。私の理解では、JDK はオープン アドレス指定の最良の方法の 1 つであるダブル ハッシュを使用します。したがって、ハッシュ スロットに関連付けられるリストはありません。
ハッシュ関数が同じキーに解決されるオブジェクトをリストに入れることができ、このリストをテーブル/マップで更新できます。
package hashing;
import java.util.HashMap;
import java.util.Map;
public class MainAnimal {
/**
* @param args
*/
public static void main(String[] args) {
Animal a1 = new Animal(1);
Animal a2 = new Animal(2);
Map<Animal, String> animalsMap = new HashMap<Animal, String>();
animalsMap.put(a1,"1");
animalsMap.put(a2,"2");
System.out.println(animalsMap.get(a1));
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("a", 2);// it overrides 1 and puts 2 there
System.out.println(map.get("a"));
}
}
class Animal {
private int index = 0;
Animal(int index){
this.index = index;
}
public boolean equals(Object obj){
if(obj instanceof Animal) {
Animal animal = (Animal) obj;
if(animal.getIndex()==this.getIndex())
return true;
else
return false;
}
return false;
}
public int hashCode() {
return 0;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
上記のコードでは、2 つの異なるものを示しています。
ケース 1 - 同じハッシュキーに解決される 2 つの異なるインスタンス ケース 2 - 2 つの異なるエントリのキーとして機能する 2 つの同じインスタンス。
動物インスタンス、a1 と a2 は同じキーに解決されます。しかし、それらはオーバーライドされません。ハッシュ メカニズムは、ハッシュ スロットを調べて、エントリを別のスロットに配置します。
2 番目のケースでは、キーは同じハッシュ キーに解決され、equals メソッドも満たされます。したがって、オーバーライドが発生します。
動物クラスで equals メソッドをこのようにオーバーライドすると、
public boolean equals(Object obj){
// if(obj instanceof Animal) {
// Animal animal = (Animal) obj;
// if(animal.getIndex()==this.getIndex())
// return true;
// else
// return false;
// }
// return false;
return true;
}
オーバーライドが発生します。動作は同じインスタンスを使用するようなものです。a1 と a2 は同じバケットにあり、equals も true を返すためです。