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();
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ArrayList中的subList方法可以用来获取原列表中的一个子列表。它的参数是起始索引和结束索引,返回的是一个新的列表,包含原列表中从起始索引到结束索引之间的元素。需要注意的是,对子列表的修改会影响原列表,因为它们共享相同的内存空间。因此,如果需要对子列表进行修改而不影响原列表,可以使用ArrayList的构造函数或clone方法来创建一个新的列表。 ### 回答2: ArrayList是Java中常用的一种集合类型,它是由数组实现的动态数组。通常情况下,我们在使用ArrayList时会遇到需要对其中一部分数据进行操作的情况,这时就可以使用subList()方法subList()方法ArrayList中的一个方法,它可以返回一个局部列表,这个列表是ArrayList中的连续一段子列表。该方法的语法如下: ``` public List<E> subList(int fromIndex, int toIndex) ``` 其中,fromIndex表示开始索引位置(包括),toIndex表示结束索引位置(不包括)。该方法返回值类型为List<E>,我们可以把它看做是一个ArrayList的局部副本。 使用subList()方法之后,我们可以对其返回的局部列表进行一些操作,例如增删改查等。这些操作同样会影响原始的ArrayList,因为subList()方法返回的是原始ArrayList视图,也就是说,修改subList中的元素也会反映到原始ArrayList中。 需要注意的是,当我们通过subList()方法获取到一个局部列表后,如果我们对原始的ArrayList进行了结构性的修改(例如删除、插入等操作),则subList()方法返回的局部列表也会随之发生变化。因此,在对subList()返回的列表进行操作时,建议先将其复制到一个新的List中,以免影响原始ArrayList和其他的subList。 总之,subList()方法ArrayList中非常有用的一个方法,它可以帮助我们更方便地处理ArrayList中的一部分数据。我们可以利用subList()方法获取一个局部列表,然后对其进行操作,从而更加高效地完成开发任务。 ### 回答3: ArrayList是Java语言中的一个非常常用的容器类,它可以存储一系列的数据对象,而sublistArrayList中的一个非常实用的方法,用于将ArrayList中的某一部分子序列截取出来,并将它存储到一个新的ArrayList中。 ArrayListsublist方法有两种形式。第一种形式是通过指定开始下标和结束下标来截取原ArrayList中的某个区间,代码如下: ``` public List<E> subList(int fromIndex, int toIndex) { ensureRange(fromIndex, toIndex); return new SubList(this, 0, fromIndex, toIndex); } ``` 其中,fromIndex表示截取的开始下标,toIndex表示截取的结束下标。需要注意的是,fromIndex是包含在截取区间中的,而toIndex则是不包含的。 比如在下列的ArrayList中: ``` ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); ``` 执行如下代码: ``` List<Integer> subList = list.subList(1, 4); ``` 则会将原ArrayList中下标从1到3的子序列截取出来,并存储到一个新的ArrayList对象中。也就是说subList中包含了2、3、4这3个元素。 另一种形式的subList方法接受一个谓词函数作为参数,用于选取ArrayList中符合条件的元素,代码如下: ``` public List<E> subList(Predicate<? super E> predicate) { Objects.requireNonNull(predicate); return new SubList(this, 1, 0, size(), predicate); } ``` 比如在下列的ArrayList中: ``` ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); ``` 执行如下代码: ``` List<Integer> subList = list.subList(x -> x > 3); ``` 则会将原ArrayList中所有大于3的元素截取出来,并存储到一个新的ArrayList对象中。也就是说subList中包含了4、5这2个元素。 总之,subList方法ArrayList中非常实用的一个方法,可以帮助开发者快速地截取和选取ArrayList中的子序列,并将其存储到一个新的ArrayList对象中,从而方便地进行各种数据操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值