面试相关-Java基础-基础知识

Java工程师知识树 / 面试相关


1、重载与重写的区别?

重载:发生在一个类里方法名必须相同,参数类型不同(参数类型不同包括:个数不同,顺序不同,类型不同),方法返回值与访问修饰符么有限制。

重写:发生在父子类中,方法名、参数列表必须相同;返回值返回需要小于或等于父类,比如父类返回值为List,之类返回值可以是ArrayList,但不能是Collection;抛出异常的范围也是小于或等于父类;但是,针对非private的访问修饰符范围大于或等于父类,而父类的访问修饰符为private时,子类不能重写该方法。

2、String,StringBuffer,StringBuilder的区别?String为什么是不可变的?

三者可通过可变性、线程安全性与性能三方面比较:

可变性:

String类中使用final关键字修饰字符数组保存字符串,private final char value[],所以String对象是不可变的,每次更改String都会创建一个新的String对象。

StringBuilderStringBuffer继承AbstractStringBuilder类,而AbstractStringBuilder也是使用char value[],但是没有使用final关键字修饰,所以这两种对象都是可变的。

线程安全性:

String中的对象是不可变的,也就是常量,是线程安全的。

AbstractStringBuilderStringBuilderStringBuffer的公共父类,定义了一些字符串的基础操作。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁(synchronized),所以StringBuffer对象是线程安全的。

StringBuilder并没有对方法加同步锁,所以是线程不安全的。

性能:

每次对String类型对象进行值变更时,都会生成一个新的String对象,然后将指针指向新的String对象。

StringBuffer每次都会对StringBuffer对象本地进行操作,而不会生成新的对象。相同情况下的StringBuilder相比使用StringBuffer仅能获取10%-15%左右的性能提升,但是却是线程不安全的。

使用场景:

1、更改操作少的字符串数据 = String

2、单线程操作字符串缓冲区下大量数据 = StringBuilder(线程不安全)

3、多线程操作字符串缓冲区下大量数据 = StringBuffer(线程安全)

String为什么是不可变的?

一、程序中对字符串操作太过频繁,以空间换时间,使用不可变对象可以增加程序效率;

二、程序中对集合有大量操作,字符串不可变可以更好的结合集合使用,比如实现Mapkey的唯一性。

3、自动装箱与自动拆箱

自动装箱:将基本数据类型用对应的引用类型包装类包装起来。intInteger对象

自动拆箱:将引用类型的包装类转换为基本数据类型。Integer对象转int

4、==与equals

equals方法为所有类父类Object类的方法,用于判断两个对象是否相等,在子类不重写equals方法的情况下,与==逻辑一致。重写equals,一般逻辑为判断两个对象的内容是否一致,也可以只判断对象的某几个属性。注:字符串String类的equals方法重写了,方法逻辑为比较字符串对象的值

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

5、final关键字理解

通过final修饰的类,方法,变量三方面理解

类:使用final修饰一个类时,表示该类不能被继承,并且类中的方法隐式的被指定final修饰。

方法:使用final修饰一个方法时,表示该方法被锁定,不能被重写从而影响方法的含义。使用private修饰符修饰的方法隐式的指定为final修饰。

变量:分两种,一修饰基本数据类型变量,则其数值一经初始化就不可再更改;二修饰引用类型变量,则对其初始化后便不能再让其指向另一个对象。

6、父子类加载顺序

  1. 先静态。具体是父类静态-->子类静态
  2. 先父后子。父类的全部-->子类的全部。
  3. 代码块的优先级:父类 > 子类;静态代码块> 非静态代码块> 构造函数
  4. 静态代码块与位置的前后有关系 ;
    非静态代码块与位置的前后有关系;
    构造函数与位置的前后无关系

7、Java中的异常处理

所有的异常都有一个父类java.lang.ThrowableThrowable有两个重要子类:Exception(异常)和Error(错误)。

Error:是程序无法处理的错误,表示运行的应用程序中较严重的问题。一般是JVM出现的问题。

Exception:是程序本身可以处理的异常,通过Java语言关键字try…catch…finally组合处理。

8、接口与抽象类的区别

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

区别:

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
    注:JDK 1.8 以后,接口里可以有静态方法和方法体了。

你可能感兴趣的:(面试相关-Java基础-基础知识)