乐趣区

关于后端:面试题百日百刷java基础篇三

锁屏面试题百日百刷,每个工作日保持更新面试题。 请看到最初就能获取你想要的, 接下来的是今日的面试题:

1.== 和 equals 的区别?**

== : 它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(根本数据类型 == 比拟的是值,援用数据类型 == 比拟的是内存地址)

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

equals() : 它的作用也是判断两个对象是否相等,它不能用于比拟根本数据类型的变量。equals() 办法存在于 Object 类中,而 Object 类是所有类的间接或间接父类。

Object 类 equals() 办法:

public boolean equals(Object obj) {

    return (this == obj);

}

equals() 办法存在两种应用状况:

状况 1:类没有笼罩 equals() 办法。则通过 equals() 比拟该类的两个对象时,等价于通过“==”比拟这两个对象。应用的默认是 Object 类 equals() 办法。

状况 2:类笼罩了 equals() 办法。个别,咱们都笼罩 equals() 办法来两个对象的内容相等;若它们的内容相等,则返回 true(即,认为这两个对象相等)。

2. 为什么要有 hashCode?**

咱们以“HashSet 如何查看反复”为例子来阐明为什么要有 hashCode

当你把对象退出 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象退出的地位,同时也会与其余曾经退出的对象的 hashcode 值作比拟,如果没有相符的 hashcode,HashSet 会假如对象没有反复呈现。然而如果发现有雷同 hashcode 值的对象,这时会调用 equals()办法来查看 hashcode 相等的对象是否真的雷同。如果两者雷同,HashSet 就不会让其退出操作胜利。如果不同的话,就会从新散列到其余地位。(摘自我的 Java 启蒙书《Head fist java》第二版)。这样咱们就大大减少了 equals 的次数,相应就大大提高了执行速度。

3. 为什么重写 equals 时必须重写 hashCode 办法?**

如果两个对象相等,则 hashcode 肯定也是雷同的。两个对象相等, 对两个对象别离调用 equals 办法都返回 true。然而,两个对象有雷同的 hashcode 值,它们也不肯定是相等的。因而,equals 办法被笼罩过,则 hashCode 办法也必须被笼罩。

hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即便这两个对象指向雷同的数据)

4. 为什么两个对象有雷同的 hashcode 值,它们也不肯定是相等的?**

因为 hashCode() 所应用的杂凑算法兴许刚好会让多个对象传回雷同的杂凑值。越蹩脚的杂凑算法越容易碰撞,但这也与数据值域散布的个性无关(所谓碰撞也就是指的是不同的对象失去雷同的 hashCode。

咱们刚刚也提到了 HashSet , 如果 HashSet 在比照的时候,同样的 hashcode 有多个对象,它会应用 equals() 来判断是否真的雷同。也就是说 hashcode 只是用来放大查找老本。

全部内容在 git 上, 理解更多请点我头像或到我的主页去取得,谢谢 **

退出移动版