JAVA基础

【基础】一文搞懂 == 、equals和hashCode

面试的时候,经常会被问到==和equals()的区别是什么?以及我们也知道重写equals()时候必须重新hashCode()。这是为什么?既然有了hashCode()方法了,JDK又为什么要提供equals()方法呢?如果在重写equals()时候没有重写hashCode(),在使用HashMap或HashSet的时候可能会出现什么情况?一文搞懂==、equals和hashCode==和equa

面试的时候,经常会被问到==和equals()的区别是什么?以及我们也知道重写equals()时候必须重新hashCode()。这是为什么?既然有了hashCode()方法了,JDK又为什么要提供equals()方法呢?如果在重写equals()时候没有重写hashCode(),在使用HashMap或HashSet的时候可能会出现什么情况?

一文搞懂 == 、equals和hashCode

== 和 equals()的区别是什么?

先来看看 == 

Java中使用==的时候,如果左右两边是基本类型和两边是应用类型的作用效果是不同的:

我们看看下面如下代码:

int x = 128;
int y = 128;
Person p = new Person(new Address("北京"));
Person p2 = p.clone();
System.out.println("两个基本类型==后值:");
System.out.println(x==y);
System.out.println("两个对象(引用类型)==后值:");
System.out.println(p == p2);
System.out.println(" \n p的地址值为:"+p +" \n p2的地址值为:"+p2.toString());

输出的结果是什么?

7541e21e96e80d99b39fc9fb582be914.png

从上面结果,我们可以得到如下结论:

当 == 左右两边是基本类型的时候,其实就是比较的是数值是否相等;

当 == 左右两边是对象(引用)类型的时候,其实比较的是p和p2这两个对象所指向的堆中的对象地址,一般我们简称:比较的是内存地址值。

需要注意:

因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。

来看看equals()

equals()方法特点:

1:equals()方法不能用于判断基本类型的变量,只能用来判断两个对象是否相等。

2:equals()方法存在于Object类中的。而我们又指导Object类是所有类的直接或者间接的父类。所以所有类都具有equals()方法

看看Object源码中equals()方法:

468328c746dd09b45dd88aa092324033.png

从源码中我们可以看出,底层其实使用的是 == 。

== 左右两边都是对象。从上

原创不易,完成人机校验,阅读全文

相关推荐