java string转list集合,list集合转成数组 Arrays.asList 存在的坑

慈云数据 2023-03-15 行业资讯 996 26

本周最后一个工作日,全力以赴。

不然我心疼哈哈哈哈

这篇文章比较简单,但是80%的Java程序员都遇到过。

引用:

阿里巴巴Java开发规范中说java string转list集合,list集合转成数组使用工具class.()方法将数组转为集合时,不能修改集合相关的方法。 它的add//clear方法会抛出()。 我们来看看为什么会出现这种情况。

问题分析

java string转list集合,list集合转成数组_string数组转list_java list转string

让我们做一个测试

public static void main(String[] args) {
 List list = Arrays.asList("a", "b", "c");
 // list.clear();
 // list.remove("a");
 // list.add("g");
 }

string数组转list_java string转list集合,list集合转成数组_java list转string

注释掉的三行可以单独取消注释,运行后确实出现了规范中提到的异常。 让我们看看 .() 做了什么。

public static  List asList(T... a) {
 return new ArrayList<>(a);
 }

看似很正常的方法,其实你点进去发现不是我们平时用的。

private static class ArrayList extends 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) a.getClass());
 System.arraycopy(this.a, 0, a, 0, size);
 if (a.length > size)
 a[size] = null;
 return a;
 }
 // 后面省略了

java list转string_java string转list集合,list集合转成数组_string数组转list

相反,它是一个内部类。 而这个内部类并没有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")) 可以像这样在外面包裹一个真实的。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon