问题:
java中实现数组与List相互转换,及转换后的注意事项
List转数组
Object[] objects = objectList.toArray(new Object[]{});
String[] strings = stringList.toArray(new String[]{});
数组转List
List<Object> objectList = new ArrayList<Object>(Arrays.asList(objects));
List<String> stringList = new ArrayList<String>(Arrays.asList(strings));
注意:
网上有很多不负责人的人会将数组转List直接用如下方式进行
List<Object> objectList = Arrays.asList(objects);
List<String> stringList = Arrays.asList(strings);
虽然编译器不会报错,但这种转换极其不提倡,因为后续如果对list进行remove()或add()时,会报错
Connected to the target VM, address: '127.0.0.1:63420', transport: 'socket'
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.smart.StringTest.main(StringTest.java:15)
Disconnected from the target VM, address: '127.0.0.1:63420', transport: 'socket'
Process finished with exit code 1
示例代码:
package com.smart;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @Author: yipeng
* @Date: 2021/8/5 12:17
*/
public class StringTest {
public static void main(String[] args) {
String[] strings = {"1", "2", "3", "4"};
// List<String> stringList = Arrays.asList(strings);
List<String> stringList = new ArrayList<String>(Arrays.asList(strings));
stringList.add("5");
String[] strings1 = stringList.toArray(new String[]{});
print(strings);
print(strings1);
}
public static void print(String[] bb) {
for (String b : bb) {
System.out.println(b);
}
}
}
报错原因:
Arrays.asList()方法的源码:

当前的ArrayList是Arrays类中自己实现的,与我们通常认为的ArrayList不同。

AbstractList<E>源码中查找add()方法

进一步查看add(size(), e)方法

即可找到抛出异常的原因。
我们通常认为的ArrayList之所以不会报错,是ArrayList类中重写了该方法。

总结:
多看看源码吧
本文探讨了Java中数组与List之间的转换方法,强调了不正确的转换可能导致的问题,如使用Arrays.asList()直接转换后无法执行add()或remove()操作。分析了错误的原因,源于Arrays类中实现的ArrayList不同于常规的ArrayList。建议开发者深入学习源码以避免此类问题。
1093

被折叠的 条评论
为什么被折叠?



