菜鸡每日一面系列打卡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
欢迎大家参加,详情请戳????
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到