Arraylist的sublist方法分析

看到这样一道面试题,发现我对Arraylist的sublist方法了解的不够深
Arraylist的sublist方法分析_第1张图片
借助这次机会决定好好看看这个sublist方法

从源码解读

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

返回一个SubList类(里面的一个内部类)
Arraylist的sublist方法分析_第2张图片
后面的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();

你可能感兴趣的:(LeetCode算法)