一、Java 语言的数据类型分为两种:基本数据类型和引用数据类型。
1.1 基本数据类型(8种)
2.2 引用数据类型(3种)
- 类(class)
- 接口(interface)
- 数组(array)
二、== 和 equals 区别是什么?
(1)==
- 对于基本数据类型,则直接对值进行比较。
- 对于引用数据类型,则是对他们的地址进行比较。(如果 == 是比较的两个对象,那么比较的是两个对象的引用,也就是判断两个对象是否指向了同一块内存区域)
(因为Java只有值传递,所以对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址)
(2)equals方法
equals:equals是Object类提供的方法之一。每一个Java类都继承自Object类,所以每一个对象都具有equals方法。
Object类中equals方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
它的作用也是判断两个对象是否相等,般有两种使用情况:
- Object中的equals方法是直接使用"=="运算符比较的两个对象,所以在没有重写equals方法的情况下,equals与"=="运算符一样,比较的是地址。
- 可以通过重写equals方法来比较两个对象的内容是否相等。
三、 为什么重写equals时必须重写hashCode方法?
如果两个对象equals()方法相等则它们的hashCode返回值一定要相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。
两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。
如果两个对象相等,则hashcode一定也是相同的。但是两个对象有相同的hashCode值,他们也不一定是相等的。
如果只重写equals方法而不重写hashCode方***造成hashCode的值不同,而equals方法判断出的结果是true。
因此,equals方法被覆盖过,则hashCode方法也必须被覆盖。
①如果重写了equals方法,而没有重写hashCode方***出现equals相等的对象,hashCode不相等的情况,重写hashCode方法是为了避免这种情况。
②使用hashCode方法提前校验,避免每一次比较都调用equals方法,提高效率。
面试官:你有没有重写过equals和hashcode?
答:在使用HashMap的“key”的部分存放自定义的对象时,重写过hashCode和equals方法。保证key是唯一的。