对象作为 map 的 key 时,需要重写 hashCode 和 equals方法
如果没有重写 hashCode 方法,那么下面的代码示例会输出 null
我们首先定义一个对象:BmapPoint,假如这个对象只重写了 equals 方法,没有重写 hashCode 方法
packagemm_test;/*** @Function: TODO ADD FUNCTION.
* @Date: 2016年3月7日 下午4:29:23
*
*@authorzhangmengmeng01@baidu.com*/
public classBmapPoint {//经度
private doublelng;//纬度
private doublelat;publicBmapPoint() {
}public BmapPoint(double lng, doublelat) {this.lng =lng;this.lat =lat;
}public booleanequals(Object obj) {if (obj instanceofBmapPoint) {
BmapPoint bmapPoint=(BmapPoint) obj;return (bmapPoint.getLng() == lng && bmapPoint.getLat() ==lat) ;
}else{return false;
}
}public doublegetLng() {returnlng;
}public void setLng(doublelng) {this.lng =lng;
}public doublegetLat() {returnlat;
}public void setLat(doublelat) {this.lat =lat;
}
}
View Code
那么我的测试 main 方法如下:
packagemm_test;importjava.util.HashMap;importjava.util.Map;/*** @Function: TODO ADD FUNCTION.
* @Date: 2016年3月7日 下午4:29:57
*
*@authorzhangmengmeng*/
public classtestsBmapPoint {public static voidmain(String[] args) {
Map bmap = new HashMap();
BmapPoint bp1= new BmapPoint(3.14, 3.25);
BmapPoint bp2= new BmapPoint(3.14, 3.25);
bmap.put(bp2, (long) 2);
System.out.println(bmap.get(bp1));
System.out.println(bmap.get(bp2));
}
}
输出结果:
3.25
3.25
null
2
解释:bp1和 bp2的内容一样,但不是同一个实例,我把 bp2放到 map 中了,如果用 bp1作为 key 去获取对应的 value 值,得到的结果为 null。
下面我重写 BmapPoint 的 hashCode 方法,在类 BmapPoint 中加入如下代码:
public inthashCode() {return new Double(lng).hashCode() + newDouble(lat).hashCode();
}
然后再运行主函数,输入结果:
3.25
3.25
2
2
这次就能 get 到对应的 value 值了。
然后碰巧我看到了《effective java》中的第9条:
覆盖 equals 是总要覆盖 hashCode
如果不这样做,就会违反 Object.hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括 HashMap、HashSet 和 HashTable……
具体内容参见《effective java》P39.后续补充。