对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法
对象作为 map 的 key 时,需要重写 hashCode 和 equals方法
如果没有重写 hashCode 方法,那么下面的代码示例会输出 null
我们首先定义一个对象:BmapPoint,假如这个对象只重写了 equals 方法,没有重写 hashCode 方法
package mm_test; /**
* @Function: TODO ADD FUNCTION. <br/>
* @Date: 2016年3月7日 下午4:29:23
*
* @author zhangmengmeng01@baidu.com
*/
public class BmapPoint { // 经度
private double lng; // 纬度
private double lat; public BmapPoint() {
} public BmapPoint(double lng, double lat) {
this.lng = lng;
this.lat = lat;
} public boolean equals(Object obj) {
if (obj instanceof BmapPoint) {
BmapPoint bmapPoint = (BmapPoint) obj;
return (bmapPoint.getLng() == lng && bmapPoint.getLat() == lat) ;
} else {
return false;
}
} public double getLng() {
return lng;
} public void setLng(double lng) {
this.lng = lng;
} public double getLat() {
return lat;
} public void setLat(double lat) {
this.lat = lat;
}
}
那么我的测试 main 方法如下:
package mm_test; import java.util.HashMap;
import java.util.Map; /**
* @Function: TODO ADD FUNCTION. <br/>
* @Date: 2016年3月7日 下午4:29:57
*
* @author zhangmengmeng
*/
public class testsBmapPoint {
public static void main(String[] args) {
Map<BmapPoint, Long> bmap = new HashMap<BmapPoint, Long>(); 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 int hashCode() {
return new Double(lng).hashCode() + new Double(lat).hashCode();
}
然后再运行主函数,输入结果:
3.25
3.25
2
2
这次就能 get 到对应的 value 值了。
原理可以参见博客:http://blog.csdn.net/benjaminzhang666/article/details/9468605
然后碰巧我看到了《effective java》中的第9条:
覆盖 equals 是总要覆盖 hashCode
如果不这样做,就会违反 Object.hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括 HashMap、HashSet 和 HashTable……
具体内容参见《effective java》P39.后续补充。
对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法的更多相关文章
- HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法
import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...
- JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法
在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...
- Hibernate中为什么要重写equals方法和hashcode方法
1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...
- HashSet中的元素必须重写equals方法和hashCode方法
http://jingyan.baidu.com/article/d5a880eb8fb61d13f147cc99.html 1.为什么必须重写这两个方法. 2.什么事hashSet去重,符合什么样的 ...
- Java重写equals方法和hashCode方法
package com.ddy; public class User { private Integer id; private String name; private St ...
- Java 如何重写对象的 equals 方法和 hashCode 方法
前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...
- java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...
- 正确重写equals方法和compareTo方法
一.概述 程序要对一堆数据元素排序,查找,增加删除.数据节点 class Node{ int type; int index; int score; } 规则: 1)对象相等:两个节点n1与n2,如果 ...
- 为什么要重写toString()方法和hashcode()方法
一.toString(): 在Object类里面定义toString()方法的时候返回的对象的哈希code码,这个hashcode码不能简单明了的表示出对象的属性.所以要重写toString()方法. ...
随机推荐
- Android在程序代码中使用String资源
this.getResources().getString(R.string.name)
- Vmware 的三种网络连接方式
VMWare提供了三种工作模式,host-only(主机模式).NAT(网络地址转换模式).bridged(桥接模式). 1.host-only(主机模式) 在某些特殊的网络调试环境中,如何要求将真实 ...
- codeforces div2.C
C. New Year and Rating time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- android 项目更改包名的方法
本文章全文转载: http://www.2cto.com/kf/201304/206747.html 1.在项目上右键,选择android tools->rename application p ...
- 安卓UDP通信2
服务器实现一发一收 服务器代码: import java.net.*; import java.io.*; public class udpRecv2 { /* * 创建UDP传输的接收端 * 1.建 ...
- MySQL架构由小变大的演变过程
假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如 ...
- Java之路——敬JAVA初学者(作者:MoMo)
作为一名大四的毕业生,大学三年过,有得有失.作为一个喜欢编程,喜欢JAVA的人,自学其实是一件美事,很有意思的事.要是能再找个女朋友一起学.嘿嘿,就不枉在大学走了一遭啊! 要离开学校了,还是想留 ...
- nodejs爬虫——汽车之家所有车型数据
应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...
- 4105: [Thu Summer Camp 2015]平方运算
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...
- [Usaco2014 Open]Gold Fair Photography(hash)
最近做了usaco2014 open的金组,果然美帝的题还是没有太简单啊QAQ,被每年的月赛骗了QAQ 不过话说官方题解真心棒(虽然英文的啃得好艰难,我英语渣你们别鄙视我= =),标程超级优美QAQ ...