java map 重写equals_对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法

对象作为 map 的 key 时,需要重写 hashCode 和 equals方法

如果没有重写 hashCode 方法,那么下面的代码示例会输出 null

我们首先定义一个对象:BmapPoint,假如这个对象只重写了 equals 方法,没有重写 hashCode 方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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.后续补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值