java经典面试题分享
- 一 ConcurrentModificationException异常出现的原因
首先我们在主方法中中运行一段代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer integer = iterator.next();
if (integer == 2)
list.remove(integer);
}
}
这段代码是有问题的,我们看一下运行后的结果:
那么针对这个错误我们怎么解决:
我们先来分析一下,list调用remoce()这个方法,最终这个方法是调用了其他方法:
最后导致了modCount和expectedModCount不一致而产生了这个异常。那怎么来解决那?
解决办法:在迭代器中如果要删除元素的话,需要调用Iterator类的remove方法。
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer integer = iterator.next();
if (integer == 2) {
//list.remove(integer);
//这里我们用迭代器的remove()方法来进行删除
iterator.remove();
System.out.println("删除成功");
}
}
运行结果:
- 二 HashMap和HashTable、ConcurrentHashMap区别?
相同点:
HashMap和Hashtable都实现了Map接口
都可以存储key-value数据
不同点:
HashMap可以把null作为key或value,HashTable不可以
HashMap线程不安全,效率高。HashTable线程安全,效率低。
HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。
什么是fail-fast?
就是最快的时间能把错误抛出而不是让程序执行。
此外:Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
ConcurrentHashMap将整个Map分为N个segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认N为16。
不过,我们也可以让一个普通的HashMap同步(只不过效率很差):
Map m = Collections.synchronizeMap(hashMap); - 三 为什么将一个数组使用Arrays.asList()方法转换的list不能进行增加和删除?
下面我们来看一下:
我们来看一下上面的代码,好像是没有什么问题的。至少编译是不会有问题的。
但是运行就会报出如下的错误:
这是为什么呐?
这是因为:使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作。
查看源码得知:
所以。肯定不能进行增加和删除