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. 【Java例题】5.5 映射类的使用

    5.映射类的使用.使用HashMap保存英文-中文对照单词词典.单词词典可以增加和删除词汇.输入一个英文单词,翻译成中文并显示.输入一个中文单词,翻译成英文并显示. package chapter6; ...

  2. PHP 的一些开发规范

    均需要遵守 PSR规范 变量命名 不用拼音 驼峰或下划线风格要一致 单词要有意义 不用关键字 常量全大写用下划线连接 代码注释 尽量让代码可读性提高,减少代码上的注释 函数头部可以描述参数和返回值及功 ...

  3. 低版本IE兼容 H5+CSS3 方案

    [主要是针对ie6 7 8对支持和让老浏览器支持html5+css3的一些js脚本] html5shiv.js  // 让IE8及耕地版本的IE识别section,article,nav等html5元 ...

  4. Python 命令行之旅 —— 初探 argparse

    『讲解开源项目系列』启动--让对开源项目感兴趣的人不再畏惧.让开源项目的发起者不再孤单.跟着我们的文章,你会发现编程的乐趣.使用和发现参与开源项目如此简单.欢迎联系我们给我们投稿,让更多人爱上开源.贡 ...

  5. Java一个简单的文件工具集

    class FileUtils { //文件目录下文件总数目 public static int fileNumber(File dir) { int filenumber = 0; if(dir.e ...

  6. 安装Windows Server 2008

    下面介绍一下,Windows Server操作系统安装,以及在企业中的应用,在小型企业中可以使用不同的版本搭建不同类型的服务,小型企业中可以搭建Web服务,FTP服务,以及DNS和DHCP服务等,在大 ...

  7. 写给新手的 Go 开发指南

    转眼加入蚂蚁已经三个多月,这期间主要维护一 Go 写的服务器.虽然用的时间不算长,但还是积累了一些心得体会,这里总结归纳一下,供想尝试 Go 的同学参考. 本文会依次介绍 Go 的设计理念.开发环境. ...

  8. gin+vue的前后端分离开源项目

    该项目是gin+vue的前后端分离项目,使用gorm访问MySQL,其中vue前端是使用vue-element-admin框架简单实现的: go后台使用jwt,对API接口进行权限控制.此外,Web页 ...

  9. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

    标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...

  10. Scrum 工件: 速度图和燃尽图

    速度图 Velocity用于衡量scrum团队持续提供业务价值的速度,可以采用历史估算的方法,衡量一个又一个sprint的速度.团队通过跟踪完成达到自己团队完成标准的故事点的数量,就可以基于相对点值对 ...