JAVA面试题之基础知识
重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和返回修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符返回小于等于父类
String,StringBuffer,StringBuilder的区别?String为什么是不可变的?
String类中使用final关键字字符数组保存字符串,private final char value[],所以String对象是不可变的。StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,在AbstractStringBuilder中也是用字符数组保存字符串,但是没有final关键字修饰,所以是可变的
线程安全性:
String对象不可变,所以是线程安全的,StringBuffer对方法或调用的方法加了同步锁,所以是线程安全的,StringBuilder没有对方法加同步锁,所以是非线程安全的。
性能:
每次对String对象进行操作时都会生成一个新的对象。然后将引用指向新的String对象。StringBuffer每次都是对原对象进行操作,不会生成新的对象,相同情况下使用StringBuilder相比StringBuffer能获得10%-15%左右的性能提升
什么是自动装箱和拆箱?
装箱:将基本类型用引用类型包装起来
拆箱:将包装类型转化为基本类型
== 和equals的区别?
==:判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象。基本数据类型比较的是值,引用数据类型比较的是数据地址。
equals():也是判断两个对象是否相等,但一般有两种使用情况:
(1)类没有覆盖equals方法,等价于用 == 比较两个对象
(2)覆盖了equals方法,相当于用equals方法来比较两个对象
- String中的equals方法是被重写过的,Object中的equals比较的是对象的内存地址,而String的equals比较的是对象的值
- 当创建String类型的对象时,虚拟机会在常量池中寻找有没有已经存在的值和要创建的对象的值相同的对象,如果有就把它赋给当前引用,否则将在常量池中创建一个String对象
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
final关键字的几点总结?
final可以修饰变量、方法、类
1.对于一个final变量,如果是基本数据类型,则值在初始化之后便不能更改,如果是引用类型,则在初始化之后便不能指向另一个对象
2.当final修饰类时,表示该类不能被继承,类中的所有成员方法都被隐式的指定为final方法
3.使用final的原因有两个,第一个是把方法锁定,防止继承类修改。第二个是效率,在早期的java实现版本中,会将final方法转为内嵌调用,但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的java版本已经不需要这些优化了)