个人博客网:https://wushaopei.github.io/    (你想要这里多有)

在创建的类不重写hashCode()和equals() 方法时,默认使用 java 提供的 java.lang.Object 下的 hashCode()和equals() 方法。
> 注意:Object 的public boolean equals(Object obj)方法主要是对非空对象的引用地址的判断相同才返回true,而非对象本身的字符串内容或数值是否相同。

简而言之,当且仅当 值A 和 值B 都是引用自同一个对象时,此方法才会返回true;

所以,当我们重写一个对象,重写了equals()方法后,通常必须重写 hashCode()方法,以维护 hashCode 方法的常规协定,该协定声明了相等对象必须具有相等的哈希码。
> 说白了,就是equals 返回true的两个值,在hashCode() 中结果也必然是true。

*例子:*
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false

这里引出一个问题,为什么要重写equals()方法呢?难道原生的不能用吗?

答案是必须重写,从前面的注意事项中可以知道,如果不重写equals 方法,那么比较的将是对象的引用是否指向同一块内存地址,而我们重写的*目的*是为了能够比较两个对象的value值是否相等。

在高级类的八个包装类与引用类型的String类型(该类对euqals和hashcode方法进行了重写)中都 是使用重写后的 equals 方法来比较对象的,*默认*比较的是值,在*比较其它自定义对象*时都是比较的引用地址。

后面会对equals 和 hashcode 的关系进行关联解释。

*hashcode*是用于散列数据的快速存取,如利用*HashSet/HashMap/Hashtable*类来存储数据时,都是根据存储对象的*hashcode*值来进行判断是否*相同*的。

那么,如果我们值重写equals ,而不重写 hashcode 会怎么样?

如果我们对一个对象重写了equals 方法,意味着只要对象的成员变量值都相等那么equals 就返回true ,但在不重写 hashcode 方法的情况下,当我们重新 new 了一个新对象。
此时,当原对象.equals(新对象)等于true时,两者的 hashcode 却是不一样的,由此会产生了理解的不一致,也违反了equals 与 hashcode的约定规则。

不重写导致的结果案例:

在不重写hashcode的情况下,如果 hashset存储两个引用不同但值相同的对象,此时hashcode返回false,认为后者与前者不重复,则会重新 newNode() 创建一个新节点将重复的值添加到集合中,意味着不可重复的单列集合中出现了两个值一样的对象,导致混淆。(假设没有重写)

所以,需要重写 hashcode()方法。

面试题:我们重写一个对象的时候为什么要同时重写hashcode()和equals()方法的更多相关文章

  1. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  2. 用HashSet的add方法谈hashcode和equals方法重写

    本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写.错误的地方望指正. 1.了解HashSet的add方法 了解一个方法的好办法是看源码,所以先看源码 private ...

  3. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

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

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

  5. 如何重写hashCode()和equals()方法

    hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...

  6. Java 重写 hashCode() 和 equals() 方法

    1. hashCode 1.1 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 ...

  7. (转)为什么要重写 hashcode 和 equals 方法?

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  8. 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重

    Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...

  9. Java中Set的contains()方法——hashCode与equals方法的约定及重写原则

    转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...

随机推荐

  1. strut2运行流程的详解

    虽然现在struts2已经慢慢淡出了视野,但是作为一个老框架,在我看来,学习价值还是有的,多阅读框架源码帮助很大,大家有空的话也可以尝试看看,好了,话不多说,今天的主题就像标题写的那样,主要探究str ...

  2. 201771010113 李婷华 《面向对象程序设计(java)》第九周总结

    一.理论知识部分 第六章 接口与内部类 1.内部类(innerclass)是定义在一个类内部的类.外层的类成为外部类(outerclass).内部类主要用于事件处理. 2.使用内部类的原因有以下三个: ...

  3. 汽车安全攻击篇:智能网联系统的短板,如何防护汽车的安全C

    我们在<速度与激情>里,经常可以看到主角们利用网络侵入汽车网络系统,然后任意的操纵这些车辆,看电影的时候会被画面所震撼到,这两年"自动驾驶"随着特斯拉的车已经越来越普及 ...

  4. 修改MySQL表中的字段属性

    登录数据库 >mysql -u root -p 数据库名称 查询所有数据表 mysql>show tables; 查询表的字段信息 mysql>desc 表名称; 1.修改某个表的字 ...

  5. MySQL数据类型笔记

    引言 作为一个做Java后端的开发者,无论是在自己平时项目学习实战还是工作中的真实项目,都离不开和数据库打交道.而MySQL作为当今最流行的关系型数据库之一,也成为了我们必须掌握的一门技术.最近在工作 ...

  6. Python-SHA256加密算法接口测试

    前言 小伙伴们在做接口测试的时候,是否遇到一些需要加密的接口,但是不知如何进行测试呢?今天我们来学习一下SHA256加密算法接口如何进行测试的. SHA256加密算法介绍: 比特币挖矿的御用算法 SH ...

  7. Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序

    分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...

  8. Hexo 博客利用 Nginx 实现中英文切换

    本文记录了对 Hexo 博客进行中英文切换的配置过程,实现同一应用共用模版,任何页面可以切换到另一语言的对应页面,并对未明确语言的访问地址,根据浏览器语言进行自动跳转 实现细则 中英文地址区分 博客中 ...

  9. CF-292D Connected Components 并查集 好题

    D. Connected Components 题意 现在有n个点,m条编号为1-m的无向边,给出k个询问,每个询问给出区间[l,r],让输出删除标号为l-r的边后还有几个连通块? 思路 去除编号为[ ...

  10. 使用IR2104S搭建的H桥-机器人队比赛经典版(原作者答疑)

    原理图地址:http://bbs.ednchina.com/BLOG_ARTICLE_3020313.HTM?click_from=8800020962,4950449047,2014-05-01,E ...