Arrays.asList() --研究
最常见的未获支持的操作,都来源于背后固定大小的数据结构支持的容器。当我们使用Arrays.asList()时,就会得到这样的容器。当然你还可以使用Collections类中不可修改的方法。
代码示例:
public class UnSupported {
static void test(String msg, List<String> list) {
System.out.println("---" + msg + "---");
Collection<String> collection = list;
Collection<String> subList = list.subList(1, 8);
Collection<String> c2 = new ArrayList<>(subList);
try {
collection.retainAll(c2);
System.out.println("正常运行collection.retainAll(c2)");
} catch (Exception e) {
System.out.println("retainAll():" + e);
}
try {
collection.removeAll(c2);
System.out.println("正常运行collection.removeAll(c2)");
} catch (Exception e) {
System.out.println("retainAll():" + e);
}
}
public static void main(String[] args) {
// Arrays.asList 生成的是一个固定的数组 不支持修改数组大小的操作
List<String> list = Arrays.asList("1 2 3 4 5 6 7 8 9 10 11".split(" "));
test("Arrays.asList()", list);
test("Modifiable copy", new ArrayList<>(list));
}
}
运行结果:
---Arrays.asList()---
retainAll():java.lang.UnsupportedOperationException
retainAll():java.lang.UnsupportedOperationException
---Modifiable copy---
正常运行collection.retainAll(c2)
正常运行collection.removeAll(c2)
分析 我们断点调试
这里我们可以看到list的类型是为Arrays下的ArrayList,这到底是什么呢,我们不妨点开源代码看一下。
这是Arrays.asList()方法,我们继续点进去
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这是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) {
a = Objects.requireNonNull(array);
}
很明显的我们可以看到它的构造 ArrayList(E[] array) {} 这里传递的就是一个固定大小的数组,其类也没有重写相关的add方法。那么我们点进它的父类看一下(AbstractList)
这是0AbstractList下的add方法。我们继续点进去
//这是AbstractList下的add方法。我们继续点进去
public boolean add(E e) {
add(size(), e);
return true;
}
看 答案是不是出来了呢,直接抛出UnsupportedOperationException这个异常
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
提问采坑题:
int num[] = {1,2,3};
List<int[]> list_int = Arrays.asList(num);
System.out.println(list_int.size());
想必很多人的答案都是3吧,答案其实是1。 因为int是基本类型,而泛型不接受基本类型。不知道的可以自己看看书。不多做解释了。
将int 类型改为Integer 答案便是3了。