前提需要理解:
1.Object默认的hashcode()返回的是对象所在的内存地址
2.Object默认equals()比较的也是对象的内存地址
3.哈希值相同的对象不一定相等,因为可能会冲突!
4.哈希值不同的对象一定不相等!
正文
在把对象插入hashmap()之前,需要通过hashcode()来计算出对象应该插入的位置。
class apple{
private int price;
private int weight;
public apple(int price, int weight){
this.price = price;
this.weight =weight;
}
public getprice(){
return price;
}
}
apple A1 = new apple(1,2)
apple A2 = new apple(1,2)
如上代码,A1和A2应该会发生冲突,因为它们的值相等。但是因为Object的hashmap()返回的内存地址,但A1和A2的内存地址不同,所以被系统认为不冲突!所以我们需要重写hashmap()
如下:
public int hashcode(){
return price;
}
此时,A1和A2经过hashmap()返回的值相等。
同理,由于Object默认equals()比较的也是对象的内存地址,所以当我们用equals()比较A1和A2时,系统判定它们不是相等的,就会判断错误。所以需要重写equals(),如下:
public boolean equals(Obejct o){
if(o == null || !(o instaceof apple)){
return false;
}
else{
return this.getprice().equals((apple)o.getprice());
}
}