很多文章都介绍过这些坑,本文做个记录,并提供解决方案。
1.Arrays.asList的坑
1.1现象
情况1:通过Arrays.asList方法生成的List数据不支持添加操作
使用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.UnsupportedOperationExceptionat 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数据不支持添加操作
情况2:通过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数据也会有同样的改变
1.2 解决方案
本文提供一个数组生成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方式。
2. list.subList的坑
2.1现象
先看代码和打印信息,代码如下:
@Testpublic 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.ConcurrentModificationExceptionat java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)at java.util.ArrayList$SubList.size(ArrayList.java:1048)
结论:list使用subList方法,如果再操作list后,不能遍历subList生成的数据,否则报错。
2.2解决方案
可以再写一个静态方法,代码如下:
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;}
测试一下,打印信息如下:
至此问题解决。