很多文章都介绍过这些坑,本文做个记录,并提供解决方案。

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.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数据不支持添加操作

        情况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现象

        先看代码和打印信息,代码如下:

    @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生成的数据,否则报错。

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;
    }

        测试一下,打印信息如下:

List那些坑-LMLPHP

至此问题解决。

12-26 08:45