1、关于异常抛出顺序问题?
里氏替换原则:能使用父类型的地方一定能用到子类型;
2、List、Set、Map是否继承Collection接口?
List和Set是;Map不是;Map是键值对映射容器,Set存储不重复的元素,List是线性结构更适合按数值索引访问元素。
3、ArrayList、Vector、LinkedList存储特性和特征?
ArrayList和Vector使用数组方式存储数据,支持数值索引直接读取数据,插入数据慢索引数据快;而Vector的方法具有synchronized关键字,属于线程安全的容器。
LinkedList使用双向链表实现存储,可以充分的利用内存碎片,索引数据慢插入数据快;
Vector属于遗留容器,已经不推荐使用。
4、Collection和Collections的区别?
Collection是一个接口,它是Set、List等容器的父接口;Collections是一个工具类,提供了一系列的静态方法来辅助容器的操作;
5、List、Map、Set三个接口存取元素时,各有什么特点?
List以特定索引来存取元素,可以有重复元素;
Set不能存放重复元素;
Map保存键值对映射,映射关系可以使一对一和多对一;
6、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较?
TreeSet存放的对象所属的类必须实现Comparable接口,提供了compareTo()方法进行比较元素的大小;
TreeMap要求存放键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。
7、sleep()和wait()的区别?
sleep()方法会让当前线程暂停指定的时间,将CPU让给其他线程,但是锁依然保持,休眠时间结束后回到就绪状态;
wait()方法会放弃对象的锁,进入对象等待池中,只有调用notify()或notifyAll()才能从新获得独享的锁并进入就绪状态;
8、sleep()和yield()方法的区别?
sleep()给其他线程机会时不考虑线程的优先级,yield()只会给相同优先级或更高优先级的线程以运行的机会;
sleep()执行后进入阻塞状态,yeild()执行后进入就绪状态;
sleep()方法抛出InterruptedException,而yeild()没有声明任何异常;
sleep()比yeild()具有更好的移植性。
9、当一个线程进入一个对象的synchronized方法A后,其他线程是否可以进入此对象的synchronized的方法B?
不能;此时该对象的锁正在被使用,只能调用非同步方法;
10、线程同步与线程调度相关的方法?
wait():处于阻塞状态,并释放所持有对象的锁;
sleep():处于睡眠状态,不释放锁,需要处理InterruptedException异常;
notify():唤醒处于等待状态的线程,由JVM决定哪个线程,与优先级无关。
notifyAll():唤醒所有处于等待状态的线程,让所有线程竞争获取锁,谁得到谁进入就绪状态;