本周最后一个工作日,全力以赴。
不然我心疼哈哈哈哈
这篇文章比较简单,但是80%的Java程序员都遇到过。
引用:
阿里巴巴Java开发规范中说java string转list集合,list集合转成数组,使用工具class.()方法将数组转为集合时,不能修改集合相关的方法。 它的add//clear方法会抛出()。 我们来看看为什么会出现这种情况。
问题分析:
让我们做一个测试
public static void main(String[] args) { Listlist = Arrays.asList("a", "b", "c"); // list.clear(); // list.remove("a"); // list.add("g"); }
注释掉的三行可以单独取消注释,运行后确实出现了规范中提到的异常。 让我们看看 .() 做了什么。
public staticList asList(T... a) { return new ArrayList<>(a); }
看似很正常的方法,其实你点进去发现不是我们平时用的。
private static class ArrayListextends AbstractList implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { a = Objects.requireNonNull(array); } @Override public int size() { return a.length; } @Override public Object[] toArray() { return a.clone(); } @Override @SuppressWarnings("unchecked") public T[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class extends T[]>) a.getClass()); System.arraycopy(this.a, 0, a, 0, size); if (a.length > size) a[size] = null; return a; } // 后面省略了
相反,它是一个内部类。 而这个内部类并没有add,clear,方法,所以抛出的异常其实是从哪里来的。
public void add(int index, E element) { throw new UnsupportedOperationException(); } public E remove(int index) { throw new UnsupportedOperationException(); }
点进去就会发现抛异常的地方,底层的clear也会被调用,所以也会抛异常。
总结:不要乱用.(),底层其实就是一个数组。 如果使用.()java string转list集合,list集合转成数组,最好不要使用它的集合操作方法。 List list = new (.("a", "b", "c")) 可以像这样在外面包裹一个真实的。