线程不安全,效率高。
List有三个儿子,我们到底使用谁呢? 看需求(情况)。 要安全吗?
要:Vector(即使要安全,也不用这个了,后面有替代的) 不要:ArrayList或者LinkedList 查询多:ArrayList 增删多:LinkedList
如果你什么都不懂,就用ArrayList。
面试题:
Collection和Collections的区别?
Collection:是单列集合的顶层接口,有子接口List和Set。
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
1.Hashtable和HashMap的区别?
Hashtable:线程安全,效率低。不允许null键和null值 HashMap:线程不安全,效率高。允许null键和null值
2.List,Set,Map等接口是否都继承子Map接口?
List,Set不是继承自Map接口,它们继承自Collection接口 Map接口本身就是一个顶层接口
编译时异常和运行时异常的区别
编译期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译 运行期异常:无需显示处理,也可以和编译时异常一样处理
throws和throw的区别(面试题) throws
用在方法声明后面,跟的是异常类名 可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常 throw
用在方法体内,跟的是异常对象名 只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
finally关键字及其面试题
1:final,finally和finalize的区别
final:最终的意思,可以修饰类,成员变量,成员方法 修饰类,类不能被继承 修饰变量,变量是常量 修饰方法,方法不能被重写
finally:是异常处理的一部分,用于释放资源。
一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
finalize:是Object类的一个方法,用于垃圾回收
2:如果catch里面有return语句,请问finally里面的代码还会执行吗? 如果会,请问是在return前,还是return后。 会。前。
准确的说,应该是在中间。
3:try...catch...finally的格式变形 A:try...catch...finally B:try...catch
C:try...catch...catch...
D:try...catch...catch...finally E:try...finally
这种做法的目前是为了释放资源。
面试题:
public class FinallyDemo {
public static void main(String[] args) { System.out.println(getInt()); }
public static int getInt() { int a = 10; try {
System.out.println(a / 0); a = 20;
} catch (ArithmeticException e) { a = 30; return a; /*
* return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的返回路径,继续走return 30; */
} finally { a = 40;
//return a;//如果这样结果就是40了。 }
return a; } }
面试题:
什么时候序列化? 如何实现序列化? 什么是反序列化?
调用run()方法为什么是单线程的呢?
因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果
要想看到多线程的效果,就必须说说另一个方法:start() 面试题:run()和start()的区别?
run():仅仅是封装被线程执行的代码,直接调用是普通方法
start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
多线程常见面试题:
1:多线程有几种实现方案,分别是哪几种? 两种。
继承Thread类 实现Runnable接口
扩展一种:实现Callable接口。这个得和线程池结合。
2:同步有几种方式,分别是什么? 两种。
同步代码块 同步方法
3:启动一个线程是run()还是start()?它们的区别? start();
run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用 start():启动线程,并由JVM自动调用run()方法
4:sleep()和wait()方法的区别
sleep():必须指定时间;不释放锁。
wait():可以不指定时间,也可以指定时间;释放锁。
5:为什么wait(),notify(),notifyAll()等方法都定义在Object类中
因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。 而Object代表任意的对象,所以,定义在这里面。
6:线程的生命周期图
新建 -- 就绪 -- 运行 -- 死亡
新建 -- 就绪 -- 运行 -- 就绪 -- 运行 -- 死亡
新建 -- 就绪 -- 运行 -- 其他阻塞 -- 就绪 -- 运行 -- 死亡 新建 -- 就绪 -- 运行 -- 同步阻塞 -- 就绪 -- 运行 -- 死亡
新建 -- 就绪 -- 运行 -- 等待阻塞 -- 同步阻塞 -- 就绪 -- 运行 -- 死亡
面试题:单例模式的思想是什么?请写一个代码体现。
面试题:close()和flush()的区别?
A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。