今天将一个数组转换成
List
然后进行 remove
操作时却抛出 java.lang.UnsupportedOperationException
异常。 package com.xiaoye.mianShi;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** * @Description : * @Author : ChenYao * @Version : 1.0 * @Create : 2019/6/20 19:12 * @Update : 2019/6/20 19:12 * @see : 一道面试题 */
public class StringDemo {
/* 找出不同的字符串; String str1 = "This is an example"; String str2 = "is example"; --------------------------------- 输入: ["This","an"]; */
public static void main(String[] args) {
String str1 = "This is an example";
String str2 = "is example";
List<String> list1 = Arrays.asList(str1.split(" "));
List<String> list2 = Arrays.asList(str2.split(" "));
//List<String> list1 = new ArrayList<>(Arrays.asList(str1.split(" ")));
//List<String> list2 = new ArrayList<>(Arrays.asList(str2.split(" ")));
List<Integer> x = new ArrayList<>();
for (int i = 0; i < list1.size(); i++) {
for (int j = 0; j < list2.size(); j++) {
if (list1.get(i).equals(list2.get(j))) {
x.add(i);
}
}
}
if (x.size() < 1) {
return;
}
for (int i = x.size() - 1; i >= 0; i--) {
int index = x.get(i);
// java.lang.UnsupportedOperationException
list1.remove(index);
}
System.out.println(list1);
}
}
看了下源码才发现使用 Arrays.asList(arr
) 转换的List
并不能进行 add
和remove
操作。
Arrays.asList(arr)
返回的类型是 Aarrays$ArrayList
并不是 ArrayList
。
Aarrays$ArrayList
和 ArrayList
都继承 AbstractList
,但是 AbstractList
中的add
方法和remove
方法都是直接抛出 UnsupportedOperationException
,并没有直接实现。
ArrayList
重写了add
方法和remove
方法,能够进行对应的添加和删除操作,Aarrays$ArrayList
却没有去重写,所以此时调用 add
方法和remove
方***抛出 UnsupportedOperationException
。
解决
List<String> list1 = new ArrayList<>(Arrays.asList(str1.split(" ")));
List<String> list2 = new ArrayList<>(Arrays.asList(str2.split(" ")));
源码
Arrays.asList(arr
返回Aarrays$ArrayList
,Aarrays$ArrayList
继承 AbstractList
ArrayList
继承 AbstractList
AbstractList
中的 add
方法和remove
方法都直接抛出UnsupportedOperationException
ArrayList
重写add
方法和remove
方法