当前位置: 首页 > news >正文

两个对象的 hashCode()相同,则 equals()也一定为 true吗?

微信搜索《Java鱼仔》,每天一个知识点不错过

(一)每天一个知识点

两个对象的 hashCode()相同,则 equals()也一定为 true吗?

(二)结论

这是一道很常见并且很简单的面试题,这道题的结论:

两个对象的hashCode()相同,equals()不一定为true;

两个对象的equals为true,则两个对象的hashcode一定为true;

(三)再多学一点

首先我们来了解一下hashCode()方法是干什么的,hashCode的存在主要是用于查找的快捷,比如我们常用的HashMap等集合,hashCode用来在散列的存储结构中确定对象的存储地址。

java中所有的对象都有一个父类Object,而Object有一个hashCode方法,Java的所有类都有hashcode方法。

我们来看看hashcode的计算方法:

for (Object element : a)
    result = 31 * result + (element == null ? 0 : element.hashCode());

hashcode其实就是对一个对象中的每个元素进行一次运算生成的结果值,两个不同的对象是有可能出现同一个hash值的。

比如下面两个字符串:

String s1="Ma";
String s2="NB";
System.out.println(s1.hashCode()==s2.hashCode());  //true
System.out.println(s1.equals(s2));  //false

虽然两个Ma和NB两个字符串不同,但是他们有相同的hashcode值2484。

创建实体类的时候如果要使用hashCode方法或equals方法时需要在实体类中重写:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return Objects.equals(name, user.name) &&
            Objects.equals(age, user.age);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

同理,实体对象同样存在两个不同对象存在同一个hash值的情况。

相关文章:

  • 抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
  • CLion 2016.1新增Python、Swift支持,并改进了C++支持
  • SpringBoot如何实现异步、定时任务?
  • Java中BIO、NIO、AIO 有什么区别?
  • 网络协议系列之二:HTTP(2)
  • redis和mysql数据不一致问题如何解决?
  • Spring中的资源加载策略
  • 你知道迭代器 Iterator 是什么吗?
  • 什么是乐观锁、什么是悲观锁,两种锁在Java中的具体应用场景有哪些
  • Error: Out of memory! attempting SFTP connectio
  • 谈一谈session和cookie的区别,以及session的实现机制
  • Android--activity获取返回值
  • 你能说出四种创建线程的方式吗?
  • IOS 多线程01-线程基础知识
  • 说一下runnable 和 callable 有什么区别?Future是什么?
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • css属性的继承、初识值、计算值、当前值、应用值
  • extract-text-webpack-plugin用法
  • flask接收请求并推入栈
  • Git初体验
  • iOS 颜色设置看我就够了
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • mysql 5.6 原生Online DDL解析
  • SpringCloud集成分布式事务LCN (一)
  • Webpack 4 学习01(基础配置)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从setTimeout-setInterval看JS线程
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 码农张的Bug人生 - 见面之礼
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ionic入门之数据绑定显示-1
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • Spring Batch JSON 支持
  • #define
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (Git) gitignore基础使用
  • (HAL库版)freeRTOS移植STMF103
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)JAVA使用POI操作excel
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三分钟)速览传统边缘检测算子
  • (一)Neo4j下载安装以及初次使用
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .net Stream篇(六)
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net 验证控件和javaScript的冲突问题
  • .NET 中的轻量级线程安全
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET中GET与SET的用法
  • [20150321]索引空块的问题.txt
  • [20171106]配置客户端连接注意.txt