JAVA面试题整理---基础问题

1、重载和重写

方法重写的原则:

  1. 重写方法的方法名称、参数列表必须与原方法的相同,返回类型可以相同也可以是原类型的子类型(从Java SE5开始支持)。
  2. 重写方法不能比原方法访问性差(即访问权限不允许缩小)。
  3. 重写方法不能比原方法抛出更多的异常。
  4. 被重写的方法不能是final类型,因为final修饰的方法是无法重写的。
  5. 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
  6. 被重写的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足重写条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足重写条件,但是仍然不会发生重写,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
    重写是发生在运行时的,因为编译期编译器不知道并且没办法确定该去调用哪个方法,JVM会在代码运行的时候作出决定。

方法重载的原则:

  1. 方法名称必须相同。
  2. 参数列表必须不同(个数不同、或类型不同、参数类型排列顺序不同等)。 方法的返回类型可以相同也可以不相同。
  3. 仅仅返回类型不同不足以成为方法的重载。
  4. 重载是发生在编译时的,因为编译器可以根据参数的类型来选择使用哪个方法。

重写和重载的不同:

  1. 方法重写要求参数列表必须一致,而方法重载要求参数列表必须不一致。
  2. 方法重写要求返回类型必须一致(或为其子类型),方法重载对此没有要求。
  3. 方法重写只能用于子类重写父类的方法,方法重载用于同一个类中的所有方法。
  4. 方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
  5. 父类的一个方法只能被子类重写一次,而一个方法可以在所有的类中可以被重载多次。
  6. 重载是编译时多态,重写是运行时多态。
2、String StringBuilder StringBuffer
  1. 运行速度快慢为:StringBuilder > StringBuffer > String。
  2. String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
  3. 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。
  4. 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
  5. String:适用于少量的字符串操作的情况
    StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
    StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
3、equals()与‘==’的区别
  1. 默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。
  2. equals()的重写规则:
    自反性。对于任何非null的引用值x,x.equals(x)应返回true。
    对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。
    传递性。对于任何非null的引用值x、y与z,如果y.equals(x)返回true,y.equals(z)返回true,那么x.equals(z)也应返回true。
    一致性。对于任何非null的引用值x与y,假设对象上equals比较中的信息没有被修改,则多次调用x.equals(y)始终返回true或者始终返回false。
    对于任何非空引用值x,x.equal(null)应返回false。
4、为什么重写equals()的同时还得重写hashCode()

在Java API文档中关于hashCode方法有以下几点规定

  1. 在java应用程序执行期间,如果在equals方法比较中所用的信息没有被修改,那么在同一个对象上多次调用hashCode方法时必须一致地返回相同的整数。如果多次执行同一个应用时,不要求该整数必须相同。
  2. 如果两个对象通过调用equals方法是相等的,那么这两个对象调用hashCode方法必须返回相同的整数。
  3. 如果两个对象通过调用equals方法是不相等的,不要求这两个对象调用hashCode方法必须返回不同的整数。但是程序员应该意识到对不同的对象产生不同的hash值可以提供哈希表的性能。
  4. Object类默认的hashCode方法计算出来的对象存储地址
5、自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;

  1. 装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。
  2. Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127]
    的相应类型的缓存数据,Character 创建了数值在[0,127]范围的缓存数据,Boolean 直接返回 True Or False。
  3. 两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

在这里插入图片描述
5.

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值