最近代碼中需要對兩個數組求交,想當然便用到了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);