java 面试题
1 同步方法和同步代码块的区别是什么?
答: 同步方法的锁是当前类的对象,同步代码块的锁可以自定义,同步方法锁的范围较大,对性能的影响比较大,因此代码中尽量用同步代码块。
2 什么是死锁(deadlock)?
答:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
3 Iterator和ListIterator的区别是什么?
下面列出了他们的区别:
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
4 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
快速失败:当你在迭代一个集合的时候,如果有另一个线程正在修改你正在访问的那个集合时,就会抛出一个ConcurrentModification异常。
在java.util包下的都是快速失败。
安全失败:你在迭代的时候会去底层集合做一个拷贝,所以你在修改上层集合的时候是不会受影响的,不会抛出ConcurrentModification异常。
在java.util.concurrent包下的全是安全失败的。
5 HashMap 的工作原理
答 : HashMap的底层是用hash数组和单向链表实现的 ,当调用put方法是,首先计算key的hashcode,定位到合适的数组索引,然后再在该索引上的单向链表进行循环遍历用equals比较key是否存在,如果存在则用新的value覆盖原值,如果没有则向后追加。
6.hashCode()和equals()方法的重要性体现在什么地方?
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
7.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
- Array可以包涵基本类型和对象类型,ArrayList只能包涵对象类型。
- Array大小是固定的,ArrayList的大小是动态变化的,
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
8.ArrayList和LinkedList有什么区别?
ArrayList底层是数组,LinkedList底层是链表,ArrayList随机存取速度快,LinkedList插入和删除速度快