每日一面——谈一谈你对==,equals()以及hashCode()的理解

菜鸡每日一面系列打卡3

每天一道面试题目 

助力小伙伴轻松拿offer

坚持就是胜利,我们一起努力!

题目描述

谈一谈你对==,equals()以及hashCode()的理解。

题目分析

这是一道Java基础知识里面的常考题,它能反映你对于对象相等的理解,更进一步反映你对于对象本身的理解。另外,这三者也是日常编程工作中会经常接触到的知识点,重要性自然不言而喻。

题目解答

首先,我们来说一说==与equals()。

在Java中,==用来判断两个基本数据类型的值是否相等,以及用来判断两个对象的内存地址是否相等。

有趣的是,equals()同样用来判断两个对象是否相等。equals()是源自Object类中的一个方法。众所周知,在Java中,Object类是其他所有类的父类,在Object类中,equals()方法的行为表现与==是一致的,都是判断两个对象的内存地址是否相等。因此,equals()方法的行为表现取决于子类是否重写了equals()方法。比如String类就重写了equals()方法,因此其判断的是两个字符串对象的内容是否相等。

下面我们举两个例子,这两个例子集中反映了==与equals()的区别与联系。另外,值得注意的是,这两个例子不仅涉及了==与equals()的相关内容,还涉及了自动装箱与拆箱机制中的缓存机制,以及虚拟机常量池的相关知识,只有真正弄懂了下面两段程序的运行结果背后的原理,在回答这道面试题时才能游刃有余:

public static void main(String[] args) {
    
    // 定义四个int类型的变量,并赋初值
    int num1 = 1, num2 = 1, num3 = 1000, num4 = 1000;
    // 定义八个Integer类型的变量,并赋初值
    Integer num5 = 1, num6 = 1;
    Integer num7 = new Integer(1), num8 = new Integer(1);
    Integer num9 = 1000, num10 = 1000;
    Integer num11 = new Integer(1000), num12 = new Integer(1000);
    
    // result is true
    System.out.println(num1 == num2);
    
    // result is true
    System.out.println(num3 == num4);
    
    // result is true
    System.out.println(num5 == num6);
    
    // result is true
    System.out.println(num5.equals(num6));
    
    // result is false
    System.out.println(num7 == num8);
    
    // result is true
    System.out.println(num7.equals(num8));
    
    // result is false
    System.out.println(num9 == num10);
    
    // result is true
    System.out.println(num9.equals(num10));
    
    // result is false
    System.out.println(num11 == num12);
    
    // result is true
    System.out.println(num11.equals(num12));
    
}
public static void main(String[] args) {
    
    // 定义五个字符串类型的变量
    String s1 = "a", s2 = "a", s3 = new String("a"), s4 = new String("a"), s5 = null;
    
    // result is true
    System.out.println(s1 == s2);
    
    // result is true
    System.out.println(s1.equals(s2));
    
    // result is false
    System.out.println(s3 == s4);
    
    // result is true
    System.out.println(s3.equals(s4));
    
    // result is true
    System.out.println(s5 == null);
    
}

接下来,我们看一下hashCode(),hashCode()同样是源自Object类中的一个方法,其作用是返回哈希码(一个int值),哈希码的作用是确定该对象在哈希表中的索引位置,其可以降低在哈希表中equals()方法的调用次数,从而提高效率。

因此,hashCode()与equals()需要遵循以下原则:

  • 如果两个对象equals()返回结果为true,则hashCode()返回值一定相等

  • 两个对象内容相等,对两个对象调用equals()返回结果为true

  • 两个对象hashCode()返回值相等,它们equals()返回结果不一定为true

  • equals()方法被重写过,则hashCode()方法也必须被重写。hashCode()的默认行为是对堆上的对象产生独特值,如果没有重写hashCode(),则该类的两个对象无论如何不会相等。

以上便是菜鸡对于==,equals()以及hashCode()的粗浅理解。

福利活动

为了感谢大家一直以来的陪伴

鼓励小伙伴们积极参与学习打卡活动

菜鸡在劳动节发起了留言集赞活动,

活动时间截至2020年5月5日19:00

欢迎大家参加,详情请戳????

劳动节来了,菜鸡送福利!

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值