整理些面试题,以备面试会遇到。
1、重载和重写的区别?
重载:发生在同一个类中,方法名相同,形式参数类型不同,和返回值类型无关,和修饰符列表无关。
重写:发生在不同的类中,方法名相同,形式参数类型相同,返回值小于等于父类 ,修饰符大于等于父类。
形式参数类型指参数类型、参数个数、参数顺序。
2、String、StringBuffer和StringBuilder区别?
String:不可变字符串。
StringBuffer:可变字符串,效率较低,线程安全。
StringBuilder:可变字符串,效率较高,线程不安全。
3、抽象类和接口区别?
抽象类:可以有抽象方法和实现方法,
一个类只能继承一个抽象类,实现时可以有选择地重写需要用到的方法,
is a关系,比如空调是制冷机,并具有加热功能。所以空调需继承制冷机类。
接口:只能有抽象方法,
一个类能实现多个接口,实现接口时一定要实现接口里定义的所有方法,
like a关系,比如空调是制冷机,并具有加热功能。所以空调需实现加热接口。
4、BIO、NIO、AIO 有什么区别?
BIO:同步阻塞,使用那个经典的烧开水例子,有一排水壶在烧开水,BIO模式是一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
NIO:同步非阻塞,如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,当检测到有某个水壶的状态发生了改变,从而进行下一步的操作。
AIO:异步非阻塞,对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
简而言之,同步和异步最关键的区别在于同步必须等待(BIO)或者主动的去询问(NIO)IO是否完成,而异步(AIO)操作提交后只需等待操作系统的通知即可。
5、ArrayList、Vector、LinkedList区别?
ArrayList:动态数组实现,查询快,更新慢,属于非线程安全的操作类。
Vector(弃用):动态数组实现,查询较快,更新慢,属于线程安全的操作类。
LinkedList:双向链表实现,查询慢,更新快,属于非线程安全的操作类。
6、HashMap底层实现原理是什么?
jdk1.7及之前:采用数组+链表的形式。
jdk1.8及之后:采用数组+链表+红黑树的形式。当链表的长度超过8时,转换成红黑树。当红黑树上的元素个数减少到6个时就退化为链表。
扩容时默认长度为16,初始化时判断容量是否是2的幂次方,如果不是扩容至最接近的幂次方。