环境
jdk1.8
问题描述
最近在面试的时候,其有一道面试题,大致说的是有一个list列表,里面有[{5,39,41,29,26,37,38,42,48,54,55}]这几个数,删除掉里面小于50的数,最后输出[{54,55}]。当时面试时已经写出代码,回来有点不放心,所以在自己电脑上验证一下,无意中发现这样一个问题,提示异常UnsupportedOperationException。
报错内容、以及代码
解决方案
修改前:
List<Integer> list = Arrays.asList(5,39,41,29,26,37,38,42,48,54,55);
//1:使用迭代器
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Integer number = (Integer)iterator.next();
if(number<50){
iterator.remove();
}
}
//2:倒序的方式
/*for(int i = list.size()-1;i>=0;i--){
if(list.get(i)<50){
list.remove(list.get(i));
}
}*/
System.out.println(list);
修改后:
List<Integer> list = new ArrayList<>(Arrays.asList(5,39,41,29,26,37,38,42,48,54,55));
//1:使用迭代器
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Integer number = (Integer)iterator.next();
if(number<50){
iterator.remove();
}
}
//2:倒序的方式
/*for(int i = list.size()-1;i>=0;i--){
if(list.get(i)<50){
list.remove(list.get(i));
}
}*/
System.out.println(list);
ps:只修改了第一行代码既可:
修改前:List list = Arrays.asList(5,39,41,29,26,37,38,42,48,54,55);
修改后:List list = new ArrayList<>(Arrays.asList(5,39,41,29,26,37,38,42,48,54,55));
解决思路
当时第一反应就是觉得是不是remove地方的代码写的有问题,为此自己先检查了好几遍,然后又去百度上看别人list一边循环一边删除的代码是怎样实现的,对比之后发现和别人的没有什么区别。
在上面排除remove代码原因之后,我想会不会有可能jdk版本太高的原因,目前用的是1.8的jdk,于是将代码在1.7的环境中运行,提示一样的问题,排除jdk版本原因。
排除remove代码原因,排除jdk版本原因,于是我将目光集中到了第一行写的Arrays.asList上,根据一番源码跟踪,外加一些资料的查询,判定就是这里出现的问题。(具体的为啥asList.remove()提示UnsupportedOperationException我这边就不做过多的介绍,大家有兴趣可以自己查一下,我只是说一下我解决问题的思路,希望对大家有所帮助。)
最后
写的不好,有什么错误希望大家指正,共同进步。