Arrays.asList引起的惨案
2016-07-14 16:15
459 查看
最近代码中需要对两个数组求交,想当然便用到了List中的retainAll函数,但要将将数组转换成list。代码如下:
String[] abc = new String[] { "abc", "acd", "add" };
String[] abd = new String[] {"acd", "cd", "de"};
List<String> abcList = Arrays.asList(abc);
List<String> abdList = Arrays.asList(abd);
abcList.retainAll(abdList);
没想到执行后却抛出了异常:
java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at java.util.AbstractList$Itr.remove(AbstractList.java:360)
at java.util.AbstractCollection.retainAll(AbstractCollection.java:370)
反编译后才发现原来 Arrays.asList返回的ArrayList并不是java.util.ArrayList,而是在Arrays类中重新定义的一下内部类ArrayList:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
//.....其它的省略
}
这个ArrayList并没有重写remove方法。
修改成如下,问题解决:
String[] abc = new String[] { "abc", "acd", "add" };
String[] abd = new String[] {"acd", "cd", "de"};
List<String> abcList = new ArrayList<String>(Arrays.asList(abc));
List<String> abdList = new ArrayList<String>(Arrays.asList(abd));
abcList.retainAll(abdList);
String[] abc = new String[] { "abc", "acd", "add" };
String[] abd = new String[] {"acd", "cd", "de"};
List<String> abcList = Arrays.asList(abc);
List<String> abdList = Arrays.asList(abd);
abcList.retainAll(abdList);
没想到执行后却抛出了异常:
java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at java.util.AbstractList$Itr.remove(AbstractList.java:360)
at java.util.AbstractCollection.retainAll(AbstractCollection.java:370)
反编译后才发现原来 Arrays.asList返回的ArrayList并不是java.util.ArrayList,而是在Arrays类中重新定义的一下内部类ArrayList:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
//.....其它的省略
}
这个ArrayList并没有重写remove方法。
修改成如下,问题解决:
String[] abc = new String[] { "abc", "acd", "add" };
String[] abd = new String[] {"acd", "cd", "de"};
List<String> abcList = new ArrayList<String>(Arrays.asList(abc));
List<String> abdList = new ArrayList<String>(Arrays.asList(abd));
abcList.retainAll(abdList);
相关文章推荐
- 再谈闭包-词法作用域
- CSS 选择器参考手册
- 表单的全选和全不选择
- ping不同网站总结
- Greenplum的全量备份之gpcrondump
- hdu 1088 Write a simple HTML Browser
- 虚拟机字节码执行引擎
- MATLAB常用命令及其功能
- adroid解析XML三种方式
- 用代码实现文字扩散对齐
- Inspector属性面板中[HideInInspector]、ExecuteInEditMode等属性介绍
- Effetive Objective - C 1.Objective 2.类的头文件中尽量少引入其他类的头文件
- 设计模式(二):抽象工厂AbstractFactory(创建型模式)
- Android软件下载及环境配置(SDK无需代理翻墙,离线更新)
- 旋转链表
- HDU 3605 网络流
- Eclipse下svn的创建分支/合并/切换使用
- ./是当前目录 ../是当前的上一级目录。上上级就是../../一般绝对路径时候常用
- css控制内容显示省略号
- 虚拟机中实现rhel 6与真机无线和有线桥接连接外网