equals 与 == 的区别?
-
值类型(int,char,long,boolean 等)的话
- 都是用 == 判断相等性
-
对象引用的话
- == 判断引用所指的对象是否是同一个。
- equals 方法,是 Object 的成员函数,有些类会覆盖(override) 这个方法,用于判断对象的等价性。
例如 String 类,两个引用所指向的 String 都是 “abc” ,但可能出现他们实际对应的对象并不是同一个(和 JVM 实现方式有关),因此用 == 判断他们可能不相等,但用 equals 方法判断一定是相等的。
public class Demo2 {
public static void main(String[] args) {
String demo1 = "abc";
String demo2 = new String("abc");
if (demo1.equals(demo2)) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
if (demo1 == demo2) {
System.out.println("相等");
} else {
System.out.println("不相等");
}
}
}
如何在父类中为子类自动完成所有的 hashCode 和 equals 实现?这么做有何优劣?
父类的 equals ,一般情况下是无法满足子类的 equals 的需求。
- 比如所有的对象都继承 Object ,默认使用的是 Object 的 equals 方法,在比较两个对象的时候,是看他们是否指向同一个地址。但是我们的需求是对象的某个属性相同,就相等了,而默认的 equals 方法满足不了当前的需求,所以我们要重写 equals 方法。
- 如果重写了 equals 方法,就必须重写 hashCode 方法,否则就会降低 Map 等集合的索引速度。
说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下需要重新实现这两个方法?
答案和上一题一样
这样的 a.hashCode() 有什么用,与 a.equals(b) 有什么关系?
- equals 方法,用于比较对象的内容是否相等。
当覆盖了 equals 方法时,比较对象是否相等将通过覆盖后的 equals 方法进行比较(判断对象的内容是否相等)。
- hashCode 方法,大多在集合中用到。
将对象放入到集合中时,首先判断要放入对象的 hashCode 值与集合中的任意一个元素的 hashCode 值是否相等,如果不相等直接将该对象放入集合中。
如果 hashCode 值相等,然后再通过 equals 方法判断要放入对象与集合中的任意一个对象是否相等,如果 equals 判断不相等,直接将该元素放入到集合中,否则不放入。
有没有可能 2 个不相等的对象有相同的 hashCode?
可能会发生,这个被称为哈希碰撞。当然,相等的对象,即我们重写了 equals 方法,一定也要重写 hashCode 方法,否则将出现我们在 HashMap 中,相等的对象作为 key ,将找不到对应的 value 。
所以说,equals 和 hashCode 的关系会是&