对象作为 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()方法. ...
随机推荐
- POJ2774(二分+哈希)
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 27234 Accepted: 11 ...
- 有趣的++i和i++
作为一个天天和代码“约会”的人来说i++和++i这玩意再熟悉不过了,因为使用频率太高了. 虽然如此,但也未必见得我们真的了解她,不妨猜猜下面的输出结果. #inlcude <stdio.h> ...
- css遇到的那些坑——浏览器默认样式设置
今天自己写css样式,其中用到了<ul>标签,设置了一系列效果后运行,发现位置与设置有出入.chrome上打开检查项,发现<ul>标签的styles底部多了以下一段: ul, ...
- ionic,Angular 开发实践
1.实践参考 http://www.jianshu.com/p/ea0dcf1d31c9 原文思路搭建 2. 环境搭建步骤 : a. 安装node b.安装 cordova sudo n ...
- 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2
接上一篇 [.Net Framework 体积大?]不安装.net framework 也能运行!?开篇叙述-1 昨天写了一个引子,还是有读者对这套“小把戏”感兴趣.那么不辜负大家的希望,争取博主不做 ...
- 使用JDBC连接数据库(一)
JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API,并支持SQL语言.利用JDBC可以将JAVA代码连接到oracle.DB2.SQL ...
- Java 程序测试_判断语句
package test; public class Condition_Phase { public static void main (String[] args) { //The Traditi ...
- 微信小程序开发带来的思考
若无小程序开发经验,可先阅读 玩转微信小程序 一文. 微信小程序正式上线已有几周时间,相信它的开发模式你已烂熟于胸,可能你也有所疑问,我竟能用 web 语言开发出如此流畅的几乎原生体验的应用.可能你又 ...
- java第二天
while循环 基本格式: int sum=0: int i =0:初始化循环变量值 while(i<10循环条件){ 循环变量变化的过程 i++: 循环体 sum+=i; System.out ...
- 获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)
该脚本的目的:获取博客的排名和积分,将抓取时间,排名,积分存入数据库,然后把最近的积分和排名信息进行绘图,查看积分或者排名的变化情况. 整个脚本的流程:是利用python3来编写,利用selnium获 ...