今天将一个数组转换成
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方法

京公网安备 11010502036488号