对象作为 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()方法. ...
随机推荐
- Fiddler 模拟请求的操作方法
此文记录使用Fidder Web Debugger工具,模拟请求的操作步骤! 首先简述一下fiddler的使用: 1.下载安装Fidder抓包工具. 2.打开fiddler发现有左边的栏有请求的url ...
- 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)
版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...
- CSS实现的几款不错的菜单栏
前言 自从做了智慧城市这个项目之后,我一个做后端的开发者,瞬间转为前端开发,不过我还是很喜欢前端的.前端那些事,其实蛮有意思的,HTML实现的是静态的,使用ajax之后就可以和数据库交互了,加上js和 ...
- Android实现先横向横线展现在纵向拉开图片
前段时间产品那边让我做一个动画,要求是先以横线的方式横向展开,在纵向展示图片,最后展示几秒动画在原路返回,随后我在网上查找资料,发现这方面的记录很少,最后自己写了一个 后期还会慢慢改进: 转载请说明出 ...
- Quartz_理解2
一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job 表示一个工作,要执行的具体内容.此接口中只有一个方法 void exec ...
- c++ 继承类强制转换时的虚函数表工作原理
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...
- android学习3——长宽的单位问题dp,px,dpi
android设备的单位px,pt,dp,sp 分辨率 先通俗说下分辨率的概念.可以把屏幕想想成一个个正方形格子组成的.如果横向有1280个格子,竖向有720个格子.那么分辨率就是1280*720.这 ...
- 操作符、语句、函数——Javascript高级程序设计
1.操作符 一元操作符:++.--放在变量前后的区别,+.—表示正负 位操作符:64位存储.32位计算,对NOT.AND.OR.XOR.<<.>>.>>>的掌 ...
- 使用Bootstrap + Vue.js实现 添加删除数据
界面首先需要引入bootstrap的css和bootstrap的js文件,还有vue.js和jQuery.js才可以看见效果. 这里提供bootstrap的在线文件给大家引用: <!-- 最新版 ...
- Linux下自动备份MySQL
使用expect和mysqldump备份 expect expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预. 例如,执行shell脚本的过程中,需要输入用户名.密码 ...