1 、ArrayList、Vector、LinkedList 之间的 区别?
ArrayList:底层数组,查询快,增删慢,线程不安全,效率高
Vector:底层数组,查询快(由于线程安全,其实查询也不快),增删慢,线程安全,效率低
LinkedList:底层双重链表,查询慢,增删快,线程不安全,效率高。
3、列举Collections工具类常用方法?
Collections.sort(list);按自然顺序排序;
Collections.binarySearch(list,key); 二分查找;
Collections.reverse(list) 反转;
Collections.shuffle(list) 随机替换;
4、final、finally、finalize的区别?
final:修饰类,不能被继承,修饰方法不能被重写,修饰变量是常量
finally:是异常处理的一部分,用于释放资源,一般来说代码肯定会执行,除非在执行finally之前,jvm退出了。
finalize:是Object的一个方法,用于垃圾回收。
5、如果catch里有return语句,请问finally还会执行吗?如果会是在return前还是return后?
会,在return前执行。不过finally的逻辑不会改变return的返回值。
6、实现多线程有几种方式?分别是什么
有三种方式,继承Thread类,实现runnable接口,实现callable接口
7、runnable与callable的区别?
Callable任务执行后可以有返回值,而runnable不能返回值,call方法可以抛出异常,而run方法只能try catch,运行callable任务可以拿到一个Future对象,callable依赖线程池。
8、使用线程池的好处?
使用线程池提高系统的性能,减少创建,销毁线程的资源开销,因为代码结束后,线程不会死亡,而是再回到线城池,等待下一个对象的调用。
9、线程的生命周期?
10、sleep()和wait()的区别?
Sleep 会把执行机会给其他线程,到时后自动恢复,不会释放对象锁,
wait 会释放对象锁,只有对象发出notify或notifyAll才准备获取对象锁。
11 、join()
join 单核cpu运行多线程时底层实现原理是多个线程间切换,由于cpu的处理速度很快,看上去像多个线程同时运行。
那么我们如何实现让线程T1,T2,T3,在T1执行完成后才执行T2,T2执行完成后才执行T3,
也就是线程的串行化,通过Thread类的join方法就可以实现。
11、run()和start()的区别?
Run仅仅是调线程执行的普通方法,start首先会启动线程,由Jvm调用run方法。