Arraylist的sublist方法分析

看到这样一道面试题,发现我对Arraylist的sublist方法了解的不够深
在这里插入图片描述
借助这次机会决定好好看看这个sublist方法

从源码解读

public List<E> subList(int fromIndex, int toIndex) {
        subListRangeCheck(fromIndex, toIndex, size);
        return new SubList(this, 0, fromIndex, toIndex);
    }

返回一个SubList类(里面的一个内部类)
在这里插入图片描述
后面的add和remove方法,类似,操作原Arraylist

看到这里就可以做一下总结了:

  1. Arraylist的sublist方法,返回的是父list的一个视图,从fromIndex(包含),到toIndex(不包含)
  2. 父视图发生 “非结构性修改”,同时影响子视图;子视图发生 “非结构性修改”,同时影响父视图;“非结构性修改”:是指不改变集合的结构(长度),“结构性修改”:就是改变集合的结构(长度)
  3. 子视图发生 “结构性修改”,同时影响父视图;父视图发生 “结构性修改”,子视图失效(再次使用则会发生异常)

示例Demo

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(Arrays.asList(20, 30, 40, 10));
        List<Integer> subList = list.subList(2, 4);
        printList(list);
        printList(subList);
        // "非结构性修改",不改变长度,父子视图之间相互影响
        System.out.println("子视图进行了非结构性修改");
        subList.set(0, 400);
        printList(list);
        printList(subList);
        System.out.println("父视图进行了非结构性修改");
        list.set(2, 300);
        printList(list);
        printList(subList);
        // "结构性修改",改变长度,
        System.out.println("子视图进行了结构性修改,同时影响父视图");
        subList.add(50);
        printList(list);
        printList(subList);
        System.out.println("父视图进行了结构性修改,子视图失效(下面会报错)");
        list.add(60);
        printList(list);
        printList(subList);  // 此处异常
    }

    /**
     * 打印集合元素
     */
    private static void printList(List<Integer> list) {
        for (Integer i : list) {
            System.out.print(i + "->");
        }
        System.out.println();
    }

还有一个应用:

删除list集合中某段数据(应用到了,子视图结构性修改,影响父视图)

list.sublist(2,5).clear();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值