1、重载与重写的区别?
重载:发生在一个类里,方法名必须相同,参数类型不同(参数类型不同包括:个数不同,顺序不同,类型不同),方法返回值与访问修饰符么有限制。
重写:发生在父子类中,方法名、参数列表必须相同;返回值返回需要小于或等于父类,比如父类返回值为List,之类返回值可以是ArrayList,但不能是Collection;抛出异常的范围也是小于或等于父类;但是,针对非private的访问修饰符范围大于或等于父类,而父类的访问修饰符为private时,子类不能重写该方法。
2、String,StringBuffer,StringBuilder的区别?String为什么是不可变的?
三者可通过可变性、线程安全性与性能三方面比较:
可变性:
String
类中使用final关键字修饰字符数组保存字符串,private final char value[]
,所以String
对象是不可变的,每次更改String
都会创建一个新的String
对象。
StringBuilder
与StringBuffer
继承AbstractStringBuilder
类,而AbstractStringBuilder
也是使用char value[]
,但是没有使用final
关键字修饰,所以这两种对象都是可变的。
线程安全性:
String
中的对象是不可变的,也就是常量,是线程安全的。
AbstractStringBuilder
是StringBuilder
与StringBuffer
的公共父类,定义了一些字符串的基础操作。
StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁(synchronized
),所以StringBuffer
对象是线程安全的。
StringBuilder
并没有对方法加同步锁,所以是线程不安全的。
性能:
每次对String
类型对象进行值变更时,都会生成一个新的String
对象,然后将指针指向新的String
对象。
StringBuffer
每次都会对StringBuffer
对象本地进行操作,而不会生成新的对象。相同情况下的StringBuilder
相比使用StringBuffer
仅能获取10%-15%
左右的性能提升,但是却是线程不安全的。
使用场景:
1、更改操作少的字符串数据 = String
2、单线程操作字符串缓冲区下大量数据 = StringBuilder
(线程不安全)
3、多线程操作字符串缓冲区下大量数据 = StringBuffer
(线程安全)
String为什么是不可变的?
一、程序中对字符串
操作太过频繁,以空间换时间,使用不可变对象可以增加程序效率;
二、程序中对集合
有大量操作,字符串不可变可以更好的结合集合使用,比如实现Map
中key
的唯一性。
3、自动装箱与自动拆箱
自动装箱:将基本数据类型用对应的引用类型包装类包装起来。int
转Integer
对象
自动拆箱:将引用类型的包装类转换为基本数据类型。Integer
对象转int
4、==与equals
equals
方法为所有类父类Object
类的方法,用于判断两个对象是否相等,在子类不重写equals
方法的情况下,与==
逻辑一致。重写equals
,一般逻辑为判断两个对象的内容是否一致,也可以只判断对象的某几个属性。注:字符串String类的equals方法重写了,方法逻辑为比较字符串对象的值
。
==
:用于判断两个对象的内存地址是否是相等,即判断两个对象是否是同一个对象。==
针对基本数据类型比较的是值,引用数据类型比较的内存地址。
5、final关键字理解
通过final
修饰的类,方法,变量三方面理解
类:使用final
修饰一个类时,表示该类不能被继承,并且类中的方法隐式的被指定final
修饰。
方法:使用final
修饰一个方法时,表示该方法被锁定,不能被重写从而影响方法的含义。使用private
修饰符修饰的方法隐式的指定为final
修饰。
变量:分两种,一修饰基本数据类型变量,则其数值一经初始化就不可再更改;二修饰引用类型变量,则对其初始化后便不能再让其指向另一个对象。
6、父子类加载顺序
- 先静态。具体是父类静态-->子类静态
- 先父后子。父类的全部-->子类的全部。
- 代码块的优先级:父类 > 子类;静态代码块> 非静态代码块> 构造函数
-
静态代码块与位置的前后有关系 ;
非静态代码块与位置的前后有关系;
构造函数与位置的前后无关系
7、Java中的异常处理
所有的异常都有一个父类java.lang.Throwable
,Throwable
有两个重要子类:Exception
(异常)和Error
(错误)。
Error:
是程序无法处理的错误,表示运行的应用程序中较严重的问题。一般是JVM
出现的问题。
Exception:
是程序本身可以处理的异常,通过Java语言关键字try…catch…finally
组合处理。
8、接口与抽象类的区别
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
区别:
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
注:JDK 1.8 以后,接口里可以有静态方法和方法体了。