java中散列的冲突解决不是基于链接。据我了解,JDK 使用双散列,这是开放寻址的最佳方式之一。所以没有列表将与哈希槽相关联。
您可以将哈希函数解析为相同键的对象放入列表中,并且可以在表/映射中更新此列表。
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;
}
}
在上面的代码中,我展示了两个不同的东西。
案例 1 - 两个不同的实例解析为相同的 hashkey 案例 2 - 两个相同的实例充当两个不同条目的键。
动物实例 a1 和 a2 解析为相同的键。但它们不会被覆盖。散列机制通过散列槽进行探测,并将条目放置在不同的槽中。
对于第二种情况,键解析为相同的哈希键,并且 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。