Java 面试基础知识(二)
2018-07-21 本文已影响12人
小生不cai
1.string、stringBuffer和stringBuilder的区别
可变性:string是由private final char[]实现的所以是不可变的。而stringBuffer和stringBuilder则是没有final修饰所以是可变的。
线程安全性:string可以理解为常量所以是线程安全的。stringBuffer对字符串基本的方法如:append、insert、indexOf和expandCapcity等方法加了同步锁或者对调用的方法加了同步锁所以是线程安全的,而stringBuiler没有加所以线程不安全。
性能:string进行修改的时候都会生成一个新的string,然后将指针指向这个新的string,所以系统消耗较大;stringBuffer和stringBuilder每次操作都不生成新的对象,但是由于stringBuffer加了同步锁所以性能相对于stringBuilder性能下降10%-15%。
2.hashcode与equals方法的区别
equals相等,hashcode一定相等;hashcode相等,equals不一定相等。具体例子请看:hashmap源码。
3.抽象类和接口的区别
设计层次不同:抽象类对类抽象,接口对行为抽象。抽象类对整个类进行抽象,包括属性和行为。接口对类的方法进行抽象。
跨域不同:抽象类体现的是一种继承关系是一种“is a”的关系,子类和父类有层级的关系。接口的实现仅仅是一个契约的关系,是“like a”的关系。
4.为什么要使用泛型及泛型擦除
泛型即“参数化类型”,指定集合或者类使用的数据类型,避免强制转换。泛型擦除及将泛型代码转化为普通的代码即:1)将所有泛型使用其最上层的父类进行替换。2)移除所有数据类型。