Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >== 与equals和hashCode与equals

== 与equals和hashCode与equals

作者头像
崔笑颜
发布于 2020-08-04 07:58:53
发布于 2020-08-04 07:58:53
86300
代码可运行
举报
运行总次数:0
代码可运行

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 为一个引用
        String b = new String("ab"); // b为另一个引用,对象的内容一样
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 从常量池中查找
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一对象
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

说明:

String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”

hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

为什么要有 hashCode 我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

通过我们可以看出:hashCode() 的作用就是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

hashCode()与equals()的相关规定 如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个对象分别调用equals方法都返回true 两个对象有相同的hashcode值,它们也不一定是相等的 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖 hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
最最最常见的Java面试题总结推送给你们
首先要明确的是:“对象传递(数组、类、接口)是引用传递,原始类型数据(整型、浮点型、字符型、布尔型)传递是值传递。”
一个程序员的成长
2020/11/25
4350
最最最常见的Java面试题总结-第一周
这里会分享一些出现频率极其极其高的面试题,初定周更一篇,什么时候更完什么时候停止。
用户2164320
2018/08/07
4350
最最最常见的Java面试题总结-第一周
12道囊括重要的东西的 Java 基础问题
转载自公众号:JavaGuide 下面一共有12个Java基础问题,基本把Java基础比较重要的东西都囊括了,面试题只是为了帮大家查漏补缺,让大家看一下自己的掌握程度。如果想得到不错的offer还是要
乔戈里
2019/05/16
5520
12道囊括重要的东西的 Java 基础问题
java基础面试题
Java 虚拟机是运行字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,给出相同的结果。
Vincent-yuan
2021/02/25
4320
java基础面试题
Java 基础常见知识点&面试题总结(中),2022 最新版!
你好,我是 Guide。秋招即将到来,我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你。
Guide哥
2022/11/07
4220
Java 基础常见知识点&面试题总结(中),2022 最新版!
equals和hashcode
才学java的时候,打印某个对象是打印的一串莫名其妙的数字,后来知道这个是hashcode,就以为hashcode是对象的某个地址信息,直到看了一些文章才发现事实并非如此。
leobhao
2022/06/28
5700
hashCode()与equals()的区别
面试官可能会问你:“你重写过hashcode()和equals()么,为什么重写equals ()时必须重写hashCode()方法?”
黑洞代码
2021/01/14
7220
30道最常问的Java基础面试题
**优点:** 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
TimeFriends
2022/07/20
3150
「Java面试题精华集」Java基础知识篇(2020最新版)附PDF版 !
两个星期前,我和我的好朋友决定做一系列的 Java 知识点常见重要问题的小册。小册的标准就一个,那就是:取精华,取重点。每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标准。
Guide哥
2020/06/01
2K0
「Java面试题精华集」Java基础知识篇(2020最新版)附PDF版 !
Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定对象的存储地址,如Hashtable、hashMap中。
全栈程序员站长
2021/04/13
2.4K0
Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
【003期】JavaSE面试题(三):JavaSE语法(1)
大家好,我是Java面试题库的提裤姐,今天这篇是JavaSE系列的第三篇,主要总结了JavaSE语法中会出现的相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
java进阶架构师
2020/07/02
3920
Java基础提升篇:equals()与hashCode()方法详解
概述 java.lang.Object类中有两个非常重要的方法: 1public boolean equals(Object obj) 2public int hashCode() 3 Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。 equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: 1public boolean equals(Object obj)
好好学java
2018/07/02
4190
9. 说说hashCode() 和 equals() 之间的关系?
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
用户11332765
2024/10/28
900
9. 说说hashCode() 和 equals() 之间的关系?
【Java面试系列】Java 基础常问面试题
面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说,比面向过程要低。
山间木匠
2020/12/21
6070
Java知识面试题复习(三)Java面向对象
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
Maynor
2021/12/07
3900
Java知识面试题复习(三)Java面向对象
Java基础面试题-可能读了个假书?
重载:是同样的一个方法能够根据输入数据的不同,做出不同处理。重载是同一个类中多个同名方法根据不同的传参执行不同的逻辑处理。 重写:是当子类继承自父类的相同方法,输入数据一样,但是要做出的和父类不一样的响应时,就要重写父类方法。重写是子类堆父类的重新改造,外部样子不能改变,但是可以改变内部逻辑。
唔仄lo咚锵
2022/05/08
1K0
Java基础面试题-可能读了个假书?
java面试(基础-1)
Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
DencyCheng
2020/01/13
5950
java面试(基础-1)
Java == 与 equals
==的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
赵哥窟
2020/01/02
4570
equals() ? ==? hashCode()? 今天就把你们都认识清楚
byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),基础数据类型比较的是他们的值。
Java宝典
2021/04/22
4620
equals()与==的区别?
== : 它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
黑洞代码
2021/01/14
1.6K0
相关推荐
最最最常见的Java面试题总结推送给你们
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验