剑指Offer | 经典面试题—重写与重载

Hello,各位小伙伴们,我们的面试真题系列又来啦~

上一期我们更新的是:内部类,今天给大家带来的是重写与重载、对象相等判断 两部分

重写与重载

构造器(constructor)是否可被重写(override)

构造器不能被继承,因此不能被重写,但可以被重载。

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不 同、顺序不同),与方法 返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分。

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

对象相等判断

== 和 equals 的区别是什么

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

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况1:类没有覆盖equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象 的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例子:

1 public class test1 { 
2 public static void main(String[] args) { 
3 String a = new String("ab"); // a 为一个引用 
4 String b = new String("ab"); // b为另一个引用,对象的内容一样 
5 String aa = "ab"; // 放在常量池中 
6 String bb = "ab"; // 从常量池中查找 
7 if (aa == bb) // true 
8 System.out.println("aa==bb"); 
9 if (a == b) // false,非同一对象 
10 System.out.println("a==b"); 
11 if (a.equals(b)) // true 
12 System.out.println("aEQb"); 
13 if (42 == 42.0) { // true 
14 System.out.println("true"); 
15 } 
16 } 
17 }

说明

  • String中的equals方法是被重写过的,因为object的equals方法是比较的对象的 内存地址,而String的equals方法比较的是对象的值。

  • 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要 创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建 一个String对象。

hashCode 与 equals (重要)

HashSet如何检查重复

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

hashCode和equals方法的关系

面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时 必须重写hashCode方 法?”

hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

hashCode() 定义 在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。

这其中就利用到了散列码!(可以快速找到所需要的对象)

为什么要有 hashCode

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也 会与其他已经加入的对象的 hashcode 值作比较,如果 没有相符的hashcode,HashSet会假设对象没 有重复出现。

但是如果发现有相 同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不 同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》 第二版)。

这样我们就大大减少了equals 的次数,相应就大大提高了执行速度。

hashCode()与equals()的相关规定

如果两个对象相等,则hashcode一定也是相同的两个对象相等,对两个对象分别调用equals方法都返回true 两个对象有相同的hashcode值,它们也不一定是相等的。

因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等比的是内存中存放的内容是否相等而引用相等比较的是他们指向的内存地址是否相等。

今天就先到这里了。关注我们,后期更新更多面试题,祝你早日拿到心仪的offer!

你可能感兴趣的:(笔记,java,开发语言,后端,程序人生,架构)