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方法的问题的更多相关文章

  1. java对象equals方法的重写

    根类Object中的equals方法描述: public boolean equals(Object obj)The equals method for class Object implements ...

  2. 重写对象ToString方法

    重写对象ToString方法,引入Newtonsoft.Json public override string ToString() { JsonSerializerSettings settings ...

  3. ExtJs--16--Ext.override()方法专门用来重写对象的方法

    Ext.onReady(function(){ /** * Ext.override()方法专门用来重写对象的方法 */ //定义个类 Ext.define("U",{ //该类的 ...

  4. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  5. 为什么要重写equals()方法与hashCode()方法

    在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object ...

  6. 重写equals方法的约定

    1. 什么时候需要重写Object.equals方法 如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. ...

  7. RemoveAll 要重写equals方法

    public class User { private String name; private int age; //setter and getter public String getName( ...

  8. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

随机推荐

  1. log4net服务启动后没有记录日志

    有时候在用log4net的时候,调试或执行是ok的,但是安装服务后没有记录日志. 这是因为服务启动是在C盘启动,而程序放的位置在别的目录. 这时候需要指定读取配置文件的位置为程序所在的目录 strin ...

  2. zookeeper基本知识入门(一)

    之前我们在搭建hadoop分布式环境的时候用到过Zookeeper注册hadoop服务.那么到底Zookeeper在分布式环境中发挥了什么作用呢,这次我们就来讨论这个问题. 在分布式系统中通常都会有多 ...

  3. (二)对象以及变量的并发访问--synchronized的使用细节,用法

    具体的记录synchronized关键的各种使用方式,注意事项.感觉一步一步跟我来都可以看懂滴 大致是按照以下思路进行书写的.黑体字可以理解为结论, 1.synchronized锁的是什么? 2.sy ...

  4. Mock Server的搭建

    一.概述 我们系统与第三方开票系统有交互,场景是我们系统请求第三方开票系统,第三方开票系统根据我们的请求数据,生成开票信息然后返回发票号或异常信息,我们根据返回的信息做对应的处理.因为配合上存在一些障 ...

  5. 【模板】质数判断(Miller_Rabin)

    题意简述 给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 题解思路 费马小定理: n是一个奇素数,a是任何整数(\(1≤ a≤n-1\)) ,则\(a^{p-1}≡1 ...

  6. Nunit与Xunit介绍

    Nunit安装 首先说下,nunit2.X与3.X版本需要安装不同的vs扩展. nunit2.x安装 安装如上3个,辅助创建nunit测试项目与在vs中运行单元测试用例 . 1.Nunit2 Test ...

  7. 如何在GitHub上上传自己本地的项目?(很适合新手使用哦!)

    这是我看了一些大佬们的博客后,尝试了几次,终于成功了上传项目,所以想做一下总结,以便以后查看,同时想分享给才接触GitHub的新手们,希望能够有所帮助~ 条条大路通罗马,上传的方法肯定不止一种,等我学 ...

  8. File Compression and Archiving in linux (linux 中文件的归档)

    1. Compressing Files at the Shell Prompt Red Hat Enterprise Linux provides the bzip2, gzip, and zip ...

  9. pip安装时使用国内源,加快下载速度

    国内源: 新版ubuntu要求使用https源,要注意. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.c ...

  10. jjyq app登录接口报:“内容类型不支持”???已解决

    1.在 app上进行登录操作,成功. 2.通过fiddler抓包得到jjyq登录接口的url.param.header. 3.在pycharm中使用requests发起请求,运行报错:内容类型不支持?