Arrays.asList()、ArrayList.subList()方法的使用注意事项

Arrays.asList()

使用Arrays.asList()方法会将Array类型的数组转变为List集合形式。

package collection;

import java.util.Arrays;
import java.util.List;

public class round1 {

    public static void main(String[] args) {

        Integer[] arr= {1,2,3};
        List<Integer> list = Arrays.asList(arr);
        System.out.println(list);


        list.add(4);
        System.out.println(list);

    }
}

执行结果当执行add()方法的时候会报错

原因是:执行Arrays.asList()方法返回的并不是我们常用的util包中的List,而是Arrays中的一个内部类,它也继承了AbstractList类,但是没有重写add()等方法,所以会报错

所以:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

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


 private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, Serializable {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            this.a = (Object[])Objects.requireNonNull(array);
        }

        public int size() {
            return this.a.length;
        }

        public Object[] toArray() {
            return Arrays.copyOf(this.a, this.a.length, Object[].class);
        }

        public <T> T[] toArray(T[] a) {
            int size = this.size();
            if (a.length < size) {
                return Arrays.copyOf(this.a, size, a.getClass());
            } else {
                System.arraycopy(this.a, 0, a, 0, size);
                if (a.length > size) {
                    a[size] = null;
                }

                return a;
            }
        }

        public E get(int index) {
            return this.a[index];
        }

        .......

    }

ArrayList.subList()

ArrayList.subList()的常用情况:

 List<String> numlist = new ArrayList<>();
        numlist.add("0");
        numlist.add("1");
        numlist.add("2");
        numlist.add("3");
        numlist.add("4");
        numlist.add("5");
        numlist.add("6");
        
        List<String> subNumList = numlist.subList(2,4);

        System.out.println(numlist);
        System.out.println(subNumList);

从结果不难看出ArrayList.subList()是包含头不包含尾的。

但是使用时需要注意几点:

  1. 当修改主List的内容时,子List也会受到影响
  2. 当修改主List的结构的时候,会引起ConcurrentModificationException异常
  3. 当修改子List的内容的时候,主List也会受影响
  4. 当修改子List的结构的时候,主List也会受影响

一、当修改主List的内容时,子List也会受到影响

 List<String> numlist = new ArrayList<>();
        numlist.add("0");
        numlist.add("1");
        numlist.add("2");
        numlist.add("3");
        numlist.add("4");
        numlist.add("5");
        numlist.add("6");
        List<String> subNumList = numlist.subList(2,4);
        System.out.println(numlist);
        System.out.println(subNumList);
        numlist.set(2,"222");
        System.out.println(numlist);
        System.out.println(subNumList);

二、当修改主List的结构的时候,会引起ConcurrentModificationException异常

        List<String> numlist = new ArrayList<>();
        numlist.add("0");
        numlist.add("1");
        numlist.add("2");
        numlist.add("3");
        numlist.add("4");
        numlist.add("5");
        numlist.add("6");
        List<String> subNumList = numlist.subList(2,4);
        System.out.println(numlist);
        System.out.println(subNumList);
        numlist.add("7");
        System.out.println(numlist);
        System.out.println(subNumList);

三、当修改子List的内容的时候,主List也会受影响

        List<String> numlist = new ArrayList<>();
        numlist.add("0");
        numlist.add("1");
        numlist.add("2");
        numlist.add("3");
        numlist.add("4");
        numlist.add("5");
        numlist.add("6");
        List<String> subNumList = numlist.subList(2,4);
        System.out.println(numlist);
        System.out.println(subNumList);
        subNumList.set(0,"2222");
        System.out.println(numlist);
        System.out.println(subNumList);

四、当修改子List的结构的时候,主List也会受影响

        List<String> numlist = new ArrayList<>();
        numlist.add("0");
        numlist.add("1");
        numlist.add("2");
        numlist.add("3");
        numlist.add("4");
        numlist.add("5");
        numlist.add("6");
        List<String> subNumList = numlist.subList(2,4);
        System.out.println(numlist);
        System.out.println(subNumList);
        subNumList.add("777");
        System.out.println(numlist);
        System.out.println(subNumList);

总结

ArrayList的subList方法,返回的是原集合的一个子集合,非结构性修改任意一个集合的元素的值,都会彼此影响,结构性修改原集合时,会报ConcurrentModificationException异常,结构性修改子集合时,会影响原集合,所以使用时要注意,避免程序错误或者异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值