? ? ? ? 很多文章都介绍过这些坑,本文做个记录,并提供解决方案。
????????使用Arrays.asList方法生成的List数据,不能对其进行删除或者添加操作。代码示例如下:
public static void main(String[] args) {
List<String> newList = Arrays.asList("1", "2");
newList.add("3");
}
????????报错信息如下:
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.yangsh.meal.utils.ListUtils.main(ListUtils.java:15)
结论1:通过Arrays.asList方法生成的List数据不支持添加操作
public static void main(String[] args) {
String[] arrays = new String[]{"1","2","3"};
List<String> newList = Arrays.asList(arrays);
System.out.println(newList);
arrays[2] = "4";
System.out.println(newList);
}
? ? ? ? 打印内容如下:
[1, 2, 3]
[1, 2, 4]
结论2:通过Arrays.asList方法生成的List数据受原数组影响,原数组改变后,新生成的List数据也会有同样的改变
本文提供一个数组生成List的方法,方法如下:
package com.yangsh.meal.utils;
import java.util.ArrayList;
import java.util.List;
/**
* @author jzhou
* @DESC 数组工具类
* @date 2023/12/24 17:39
*/
public class ArraysUtils {
public static <T> List<T> asList(T[] a) {
List newList = new ArrayList<>(a.length);
for (int i = 0; i < a.length; i++) {
newList.add(a[i]);
}
return newList;
}
}
测试代码
public static void main(String[] args) {
String[] arrays = new String[]{"1","2","3"};
List<String> newList = ArraysUtils.asList(arrays);
System.out.println(newList);
arrays[2] = "4";
System.out.println("原数组修改,不影响新生成的List数据");
System.out.println(newList);
newList.add("5");
System.out.println("新数组支持add操作");
System.out.println(newList);
}
打印信息如下:
[1, 2, 3]
原数组修改,不影响新生成的List数据
[1, 2, 3]
新数组支持add操作
[1, 2, 3, 5]
至此,问题得以解决。当然还有其它的方式,比如使用stream方式。
? ? ? ? 先看代码和打印信息,代码如下:
@Test
public static void testSubList(){
List<String> list = new ArrayList<>(5);
list.add("1");
list.add("2");
list.add("3");
List<String> subList = list.subList(1, 2);
list.add("4");
for (int i = 0; i < subList.size(); i++) {
System.out.println(subList.get(i));
}
}
? ? ? ? 打印信息:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)
at java.util.ArrayList$SubList.size(ArrayList.java:1048)
结论:list使用subList方法,如果再操作list后,不能遍历subList生成的数据,否则报错。
? ? ? ? 可以再写一个静态方法,代码如下:
public static List newSubList(List list,int fromIndex,int toIndex){
ArrayList<Object> subList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if(i >= toIndex){ return subList; }
if(i >= fromIndex){
subList.add(list.get(i));
}
}
return subList;
}
? ? ? ? 测试一下,打印信息如下:
至此问题解决。