Java中equals相关

目录

  • Java中equals相关
    • equals()与==的关系
    • equals()和hashCode()
      • hashCode()介绍
      • hashCode()的意义
      • hashCode()和equals()的关系
    • 总结

equals()与==的关系

==:它是一个操作符,作用是判断两个对象的地址是否相等

基础类型比较的是值,引用类型比较的是内存地址

equals()

  • 类未覆盖equals()方法,则调用Object类提供的equals(),等价于通过“==”进行比较
  • 类覆盖equals()方法,为了比较两者内容是否相等,如相等则返回true

equals()即使被覆盖,通常第一步也是利用"=="进行判断,若为false,再根据不同类型对值进行判断

举例

 public static void main(String[] args) {String var1 = new String("asd");String var2 = new String("asd");String var3 = "asd";String var4 = "asd";System.out.println(var1.equals(var2));System.out.println(var1 == var2);System.out.println(var1 == var3);System.out.println(var3 == var4);}

输出

说明:

从上面,可以看到String类重写了equals(),因为它可以判断字符串内容是否相等返回true或false。
同时,可以注意到,String类有两种实例化方式,及直接赋值和new,new方法是直接在堆中创建一个对象,而String的赋值先检查常量池中是否有相同的字符串常量,如果有则让String变量指向此字符串常量地址,否则在常量池中创建一个字符串常量。
所以,看到String直接赋值的变量比较地址时是返回true的

equals()和hashCode()

首先,我们要记住,不管是否运用到Key-Value集合中,重写equals()一定要重写hashCode(),因为这是一个设计规范,你永远不知道这个类型未来是否会运用到Key-Value中。记住之后,下面我们来详细讲解原理上的原因

hashCode()介绍

  1. hashCode()的作用是获取哈希码(散列码),返回类型是一个整数。哈希码是用来获取对象在哈希表的索引位置的(如,在hashMap中就是利用哈希码与哈希表(数组结构)的长度的取模运算得到索引位置)。
  2. hashCode()是定义在Object.java中,及所有类都包含它。它主要在类充当散列表类(hashMap,hashtable)中Key值或散列表类(hashSet)中元素时,起到判重的作用。

hashCode()的意义

比如在HashSet集合中,由于其不可重复特性,在检测重复时,利用率hashCode
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与该位置其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 加入对象所属类中的equals()方法来检查加入对象和集合中 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。这样可以在equals()之前先判断一次,及筛选一次,减少equals()b比较次数,提高效率。
HashSet是基于HashMap实现的其判重操作也是调用的HashMap中put()

hashCode()和equals()的关系

从逻辑上讲,相等对象的哈希值一定相等,同时由于不相等对象的哈希值也可能相同及哈希碰撞。所以我们可以得到一个一般规律:当对象,equals()相等时,hashCode()返回值一定相等,equals()不等时,hashCode()不一定不等。

所以,在类被应用到散列表类型时(HashMap,Hashtable,HashSet),我们希望可以通过相等的对象获取到对于的value和相等的对象在HashSet集合中不重复,及equals()相等的对象,在散列表中只存在一个。
如果重写equals()不重写hashCode():默认会调用Object.java中的本地方法hashCode(),这会导致,在equals()判断相等的两个对象,哈希码不同,从而与我们希望的逻辑结果不同。

举例

创建一个User类,分两次实验

  1. 重写hashCode()
  2. 不重写hashCode()
public class User {private String name;private int  hash;public User(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {// return super.equals(obj);// if (obj.getClass().equals(User.class)) {}if (obj instanceof User) {User c = (User) obj;return name == c.name;}return false;}@Overridepublic int hashCode(){return Objects.hash(name);}
}

执行的主方法类

public class HashMapDemo {public static void main(String[] args) {User user1 = new User("李一");User user2 = new User("李一");System.out.println("user1.hashCode())>>>"+ user1.hashCode());System.out.println("user2.hashCode())>>>"+ user2.hashCode());HashMap<User ,String>map = new HashMap<>();map.put(user1,"李一");System.out.println("Key>>user1  "+map.get(user1));System.out.println("Key>>user2  "+map.get(user2));}}

运行结果

第一次:不重写hashCode()

第二次:重写hashCode()

说明:

  • 重写的hashCode()中,调用了Objects类中的hash(value),其功能是根据参数通过某种哈希函数产生哈希码,这里是根据name产生哈希码

分析

可以发现,两次执行的结果中,前者未重写hashCode(),对象相等,但是哈希值不相等,导致在HashMap中相当于两个不同的key,无法通过相等对象获取value。而重写后hashCode()则实现了期望。

总结

  1. equals()与操作符==的关系
    简单的说

    • equals()经过重写后要达到判断值相等的功能
    • 操作符==:是判断引用类型地址的是否相等以及基础类型(byte,int,short,long,char,double,float,char,boolean)的值是否相等的
  2. equals()与hashCode的关系
    • hashCode()返回整数,及哈希值,它是定义在Object.java中的
    • 重写equals()必要重写hashCode(),因为在类被用于散列表中时,不重写hashCode()会导致equals()相等的对象在散列表中被认为是不同的。

我要在最后重复一遍的是:有人可能会认为只要不将该类用在散列表类型中就不需要在重写equals()情况下重写hashCode(),当然从执行上来说是这样没错,但是为了代码的可扩展性安全性来讲,是有问题的,因为你无法预料到未来是否会将其用到散列表中。所以在日常编程中,严格遵守设计规范是有必要的。

java基础 equals与hashCode相关推荐

  1. 【重难点】【Java基础 03】hashCode() 和 equals()、代理模式

    [重难点][Java基础 03]重写hashCode() 和equals(). 文章目录 [重难点][Java基础 03]重写hashCode() 和equals(). 一.hashCode() 和 ...

  2. Java:重写equals()和hashCode()

    http://blog.csdn.net/ansel13/article/details/5437486 很基础的东西就是由于没上心,三番五次地出错,这次好好总结下吧. 众所周之,String .Ma ...

  3. java中equals,hashcode和==的区别

    原文地址http://blog.csdn.net/hla199106/article/details/46907725 1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 ...

  4. Java的equals() 和 hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 首先,equals()方法和hashCode()方法都来自于Object类的定义,Java类都继承了这两个方法,都定义了自己的 ...

  5. Java实战equals()与hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equal ...

  6. Java:重写equals()和hashCode() 1

    來源: 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473 ...

  7. hashCode之二--Java:重写equals()和hashCode()

    以下内容总结自<Effective Java>. 1.何时需要重写equals() 当一个类有自己特有的"逻辑相等"概念(不同于对象身份的概念). 2.设计equals ...

  8. 学习Java编程equals()和hashCode()方法

    equals()和hashCode()区别? equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. hashCode():计算出对象实例的哈希 ...

  9. 有关java中equals()与hashCode()的探讨

    参考文章:从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节--感谢原博主 先上栗子 Student student1 = new Student();Student st ...

最新文章

  1. php与html交互实现登录,php与html实现交互的基本操作
  2. Android防止按钮连续点击
  3. 一丶宝塔+青龙面板安装部署教程及命令-依赖库
  4. 使用python用什么软件-python开发工具有哪些(初学python用什么软件)
  5. 微信小程序横向图片左右滑动
  6. FastDFS问题汇总
  7. 信息收集——子域名收集
  8. asp.net core 自定义 Content-Type
  9. aliyun centos6 安装mysql_阿里云CentOS6.8安装MySQL5.6
  10. 计算机组装维护文献,组装计算机论文,关于《计算机组装维护》课程教学相关参考文献资料-免费论文范文...
  11. pip 离线安装_安装不上python的模块怎么办?别怕,我这有妙招!
  12. win10激活方法 电脑病毒和防威胁按键是灰色的,密钥无效的,无法激活的时候怎么强制激活电脑系统
  13. 如何让div靠右_如何实现CSS右对齐
  14. element-UI中分页组件显示英文的解决方案
  15. 12月运营/营销/市场/广告人热点营销指南!
  16. mysql dbms是什么_DBMS体系结构的三种类型分别是什么
  17. 牛客练习赛52 B Galahad (树状数组)
  18. Android Switch和ToggleButton控件
  19. 正大国际期货:你身边有朋友或者亲人做期货挣钱的没有?
  20. 控制电机及应用课程简单总结

热门文章

  1. 函数参数*arg和参数**arg区别
  2. matlab在量子力学中的应用,一个关于量子力学中的matlab的问题
  3. 自动化办公——PPT免费模板(强力推荐)
  4. html怎么显示一个点赞的心形,jquery心形点赞关注效果的简单实现
  5. PHP jqGrid 表格数据更新帮助代码
  6. android开发技巧精髓一
  7. WI-FI LOGO认证学习记录
  8. 朔日计算机基础答案,大學计算机基础课程练习系统使用手册.doc
  9. 当我知道这些网址以后,我后悔以前没有好好学
  10. 《ClickHouse原理解析与应用实践》读书笔记(2)