关于重写对象equals方法的问题
1.==和equals的区别
a.基本数据类型使用 == 进行值的比较
b.引用类型使用 == 进行比较时,直接比较的是对象的存储地址,即两个引用是否指向了同一个对象。
c.equals方法是基类Object中的方法,该方法如果在其他类中没有被重写,则比较的还是地址,即两个引用是否指向了同一个对象,和==是一样的(其实equals方法的默认实现就是==)。该方法在一些实现类中已经被重新了,如 String和Integer等包装类,在这些类中用来比较值是否相等。
即:equals方法如果没有重写时在比较两个对象时的作用和==是一样的,都是比较两个对象是不是同一个对象。这里如果我们比较的是地址,那么最好用==,因为无论是否重写了Object的equals方法,引用类型使用==时永远比较的是地址。
2.为什么要重写equals方法?
有时候在实际使用的过程中,比如有两个对象 Address address1=new Address("甘肃”,"兰州"); Address address2=new Address("甘肃”,"兰州"); 这两个对象中的内容都是相同的,我们则认为这两个对象是相等的。但不重写equals时使用 address1.equals(address2)进行比较时结果为 false,这不能满足我们的要求,所以就需要对从基类Object中继承的该方法进行重写,以使其符合我们的要求。
3.应该如何重写equals方法?
重写equals方法时,除了最基本的要判断两个对象的类型是否相同,以及属性值是否相同之外,有很重要的一点就是需要重写其hashcode方法,因为java中规则约定:如果两个对象equals后的结果为true时,他们的hashcode值一定是相同的;如果equals的结果为false时,则应尽量使他们的hashcode值不同。
这么约定是为了避免在使用 HashMap,HashList等集合时出现冲突,因为在默认情况下每个对象的hashcode值是通过其内存地址经过计算得到的一个int型的值,所以每个对象的hashcode值是不同的。如果给HashMap中存入以下的键值对时:Map<Adress,String> map= new HashMap<Adress,String>(),即这里使用引用类型来做map集合的键,map集合中的键是不能重复的,在往map集合中存入数据时,当前的键值会跟已经存入的键值进行比较,而比较的方法正是使用hashcode.如果不重写hashcode,经我们重写equals后两个属性值相同的对象我们认为就是相同的,但他们的hashcode还是不同的,所以这里如果存入到map集合中时,map集合还认为他们依旧是两个不同的对象,依旧能够存入,这就不对了。所以一定要重写hashcode值, 让它符合java中的约定规则。这里重写的时候我们只需想办法让这个hashcode值能满足上面所说的约定即可。注意,这里的hashcode值的生成规则是我们根据自己的需求进行控制。
一般这里不需要我们自己来写,像eclipse工具可以帮我们自动生成重写的equals和hashcode方法,直接使用即可,这里贴上自动生成的代码,大家看看其实现原理
//重写的hashcode方法,使其满足约定
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((city == null) ? 0 : city.hashCode());
result = prime * result + ((province == null) ? 0 : province.hashCode());
return result;
}
//重写的equals方法,用来比较两个对象是否相同
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Address other = (Address) obj;
if (city == null) {
if (other.city != null)
return false;
} else if (!city.equals(other.city))
return false;
if (province == null) {
if (other.province != null)
return false;
} else if (!province.equals(other.province))
return false;
return true;
}
最后,附上两篇讲的比较透彻的文章以供大家参考:Java正确的自定义比较对象----如何重写equals方法和hashcode方法,Java哈希码以及equals和==的区别
关于重写对象equals方法的问题的更多相关文章
- java对象equals方法的重写
根类Object中的equals方法描述: public boolean equals(Object obj)The equals method for class Object implements ...
- 重写对象ToString方法
重写对象ToString方法,引入Newtonsoft.Json public override string ToString() { JsonSerializerSettings settings ...
- ExtJs--16--Ext.override()方法专门用来重写对象的方法
Ext.onReady(function(){ /** * Ext.override()方法专门用来重写对象的方法 */ //定义个类 Ext.define("U",{ //该类的 ...
- Java 如何重写对象的 equals 方法和 hashCode 方法
前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...
- 为什么要重写equals()方法与hashCode()方法
在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object ...
- 重写equals方法的约定
1. 什么时候需要重写Object.equals方法 如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. ...
- RemoveAll 要重写equals方法
public class User { private String name; private int age; //setter and getter public String getName( ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
随机推荐
- log4net服务启动后没有记录日志
有时候在用log4net的时候,调试或执行是ok的,但是安装服务后没有记录日志. 这是因为服务启动是在C盘启动,而程序放的位置在别的目录. 这时候需要指定读取配置文件的位置为程序所在的目录 strin ...
- zookeeper基本知识入门(一)
之前我们在搭建hadoop分布式环境的时候用到过Zookeeper注册hadoop服务.那么到底Zookeeper在分布式环境中发挥了什么作用呢,这次我们就来讨论这个问题. 在分布式系统中通常都会有多 ...
- (二)对象以及变量的并发访问--synchronized的使用细节,用法
具体的记录synchronized关键的各种使用方式,注意事项.感觉一步一步跟我来都可以看懂滴 大致是按照以下思路进行书写的.黑体字可以理解为结论, 1.synchronized锁的是什么? 2.sy ...
- Mock Server的搭建
一.概述 我们系统与第三方开票系统有交互,场景是我们系统请求第三方开票系统,第三方开票系统根据我们的请求数据,生成开票信息然后返回发票号或异常信息,我们根据返回的信息做对应的处理.因为配合上存在一些障 ...
- 【模板】质数判断(Miller_Rabin)
题意简述 给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 题解思路 费马小定理: n是一个奇素数,a是任何整数(\(1≤ a≤n-1\)) ,则\(a^{p-1}≡1 ...
- Nunit与Xunit介绍
Nunit安装 首先说下,nunit2.X与3.X版本需要安装不同的vs扩展. nunit2.x安装 安装如上3个,辅助创建nunit测试项目与在vs中运行单元测试用例 . 1.Nunit2 Test ...
- 如何在GitHub上上传自己本地的项目?(很适合新手使用哦!)
这是我看了一些大佬们的博客后,尝试了几次,终于成功了上传项目,所以想做一下总结,以便以后查看,同时想分享给才接触GitHub的新手们,希望能够有所帮助~ 条条大路通罗马,上传的方法肯定不止一种,等我学 ...
- File Compression and Archiving in linux (linux 中文件的归档)
1. Compressing Files at the Shell Prompt Red Hat Enterprise Linux provides the bzip2, gzip, and zip ...
- pip安装时使用国内源,加快下载速度
国内源: 新版ubuntu要求使用https源,要注意. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.c ...
- jjyq app登录接口报:“内容类型不支持”???已解决
1.在 app上进行登录操作,成功. 2.通过fiddler抓包得到jjyq登录接口的url.param.header. 3.在pycharm中使用requests发起请求,运行报错:内容类型不支持?