首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏IT云清

    Java集合的subList方法分析

    本文研究List集合的subList方法,测试方式为:新建一个集合,然后截取原集合的部分元素,然后去操作新集合和原集合来观察结果。 = list.subList(0, 3); System.out.println(subList); //截取的新集合添加元素 subList.add( 33); System.out.println(subList); System.out.println(list); } 结果为: [1, 2, 3] [1, = list.subList(0, 3); System.out.println(subList); System.out.println(list); list.subList(from, to).clear(); 相似的语句可以用于indexOf,lastIndexOf,以及Collections集合中的所有算法都可以应用于subList.

    2.1K10发布于 2019-01-22
  • 来自专栏全栈程序员必看

    list的sublist方法_arraylist用法

    ,又见面了,我是你们的朋友全栈君 /************************************************/ List<Object> tempList = lists.subList ********************************************/ 如果List<Object> tempList = new ArrayList<Object>(lists.subList /************************************************/ lists.subList(2, lists.size()).clear(); lists的clear ()方法会把sublist截取的集合部分从lists中移除掉。

    59540编辑于 2022-09-20
  • 来自专栏关忆北.

    List subList()方法缺陷及替代方案

    技术背景 在日常开发中,我们常遇到将一个List列表分割成多个的场景,List提供了subList()方法避免开发者重复造轮子。 subList()的用法 ArrayList类是接口List的一个实现,以下subList()使用方法参考示例来自ArrayList。 (0, 1); System.out.println(subString); 输出: [hello] subList实现 ArrayList的subList()源码如下: public List <E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, offset, fromIndex, toIndex); } SubList类是ArrayList的一个内部类,它继承自AbstractList抽象类,在SubList

    89330编辑于 2023-10-11
  • 来自专栏做不甩锅的后端

    ArrayList源码分析(基于jdk1.8)(二):subList陷阱

    (AsListTest.java:25) 2.源码分析 可以看到,在subList产生的新的子集之后,我们对subList进行了set操作,之后再对list本身执行操作。 2.1 subList方法源码 在ArrayList中,subList是ArrayList的一个内部类。 2.2 SubList类源码 private class SubList extends AbstractList<E> implements RandomAccess { private final 也就是说,SubList本身并不是创建了一个新的ArrayList。而是一个新的视图类SubList。这个类还不能强转为ArrayList。 4.正确的打开方式 如果我们需要subList的这个子集,同时又不想对原有的ArrayList造成影响,那么我们可以对这个新的subList进行拷贝。这就类似于一个CopyOnRead。

    71830发布于 2020-08-04
  • 来自专栏闷骚的程序员

    Java|List.subList 踩坑小记

    ,操作 subList List<Integer> subList = list.subList(0, 3); subList.add(6); System.out.println(list.size (int fromIndex, int toIndex); 这里面有几个要点: subList 返回的是原 List 的一个 视图,而不是一个新的 List,所以对 subList 的操作会反映到原 List 上,反之亦然; 如果原 List 在 subList 操作期间发生了结构修改,那么 subList 的行为就是未定义的(实际表现为抛异常)。 我们还可以试下,在声明 subList 后,如果对原 List 进行元素增删操作,然后再读写 subList,基本都会抛出此异常。 因为 subList 里的所有读写操作里都调用了 checkForComodification(),这个方法里检验了 subList 和 List 的 modCount 字段值是否相等,如果不相等则抛出异常

    78740编辑于 2023-10-23
  • 来自专栏IT大咖说

    为什么要谨慎使用Arrays.asList、subList

    使用ArrayList的subList的注意事项 先来看下subList的简单使用: List<String> bookList = new ArrayList<>(); bookList.add("遥远的救世主 从运行结果可以看出,subList返回的是bookList中索引从fromIndex(包含)到toIndex(不包含)的元素集合。 2.5 原因分析 首先,我们看下subList方法的注释,了解下它的用途: ? , size); return new SubList(this, 0, fromIndex, toIndex); } 1234 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示 可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

    1.1K21发布于 2021-01-27
  • 来自专栏肉眼品世界

    请谨慎使用Arrays.asList、ArrayList的subList

    使用ArrayList的subList的注意事项 先来看下subList的简单使用: List<String> bookList = new ArrayList<>(); bookList.add("遥远的救世主 在这里插入图片描述 从运行结果可以看出,subList返回的是bookList中索引从fromIndex(包含)到toIndex(不包含)的元素集合。 2.5 原因分析 首先,我们看下subList方法的注释,了解下它的用途: ? , size); return new SubList(this, 0, fromIndex, toIndex); } 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示 参考 谨慎使用ArrayList中的subList方法 《阿里巴巴Java开发手册》泰山版

    68420发布于 2021-03-26
  • 来自专栏影子

    ArrayList分析2 :Itr、ListIterator以及SubList中的坑

    ArrayList分析2 : Itr、ListIterator以及SubList中的坑 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/16409137.html ,尤其在SubList表现的尤为严重~ 先看看ArrayList的subList方法定义: public List<E> subList(int fromIndex, int toIndex) , toIndex); } 可以看到subList方法返回的是SubList的一个实例,好,继续看构造函数定义: private class SubList extends AbstractList 返回的是一个深度拷贝的数组,哪知SubList与ArrayList内部都是一家人(elementData),所以在使用subList的函数时要谨记这一点,当然咯,既然SubList也是继承自AbstractList ,subList返回的数组也能继续调用subList方法,内部操作的数组也是一样,是不是很吊诡 二.ListItr的previous方法不太好用 其实这是个小问题,我是基于以下两点来判断的. 1.使用迭代器的习惯

    55530编辑于 2022-07-09
  • 来自专栏小工匠聊架构

    Java开发规范02 - 集合篇_ArrayList#subList

    ---- Arrays.subList 规则 ? ? ---- Code 基本使用 /** * subList的注意事项 */ public static void subList(){ List<String public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex , size); return new SubList(this, 0, fromIndex, toIndex); } 重点看 new SubList(this, 0, fromIndex 可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

    46320发布于 2021-08-17
  • 来自专栏Rust语言学习交流

    【Rust投稿】从零实现消息中间件(3)-SUBLIST

    上一篇中提到subject是一种Trie树,在实现的过程中发现非常琐碎,也不好讲解,因此考虑先实现一个简单版本的.具体来说就是

    61520发布于 2020-03-06
  • 来自专栏测试技术圈

    测试应该关注java.util.List.subList的坑

    java中有一个返回子列表的方法: public list<E> subList(int fromIndex, int toIndex){ subListRangeCheck(fromIndex , toIndex,size); return new SubList(this , 0, fromIndex, toIndex); } 返回一个fromIndex为起点,toIndex为终点 这也导致了,如果针对原来的list或者是sublist返回的list的修改(这里的修改是不涉及list大小),都是对同一段内存存储的数据做修改。 如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用。 特别提醒:在使用sublist部分的白盒测试要重点对上述情况做测试。

    79320发布于 2019-08-02
  • 来自专栏Java帮帮-微信公众号-技术文章全总结

    【Java提高二十】集合指定初始容量&asList缺陷&subList缺陷

    ---- subList缺陷 我们经常使用subString方法来对String对象进行分割处理,同时我们也可以使用subList、subMap、subSet来对List、Map、Set进行分割处理,但是这个分割存在某些瑕疵 一、subList返回仅仅只是一个视图 首先我们先看如下实例: ? 首先我们先不论结果的正确与否,我们先看subList的源码: ? 诚然,到了这里我们可以判断subList返回的SubList同样也是AbstractList的子类,同时它的方法如get、set、add、remove等都是在原列表上面做操作,它并没有像subString Java细节(3.1):subList返回的只是原列表的一个视图,它所有的操作最终都会作用在原列表上 二、subList生成子列表后,不要试图去操作原列表 从上面我们知道subList生成的子列表只是原列表的一个视图而已

    92170发布于 2018-03-12
  • 来自专栏做不甩锅的后端

    ArrayList源码分析(基于jdk1.8)(二):subList陷阱补充

    关于ArrayList的subList方法,还会出现另外一个问题就是强引用释放问题。 前文提到,如果采用subList则实际上是返回的一个内部类SubList。 , size); return new SubList(this, 0, fromIndex, toIndex); } SubList源码: private class SubList extends 方法调用的时候将this传递到了SubList的parent属性中。 如果我们在实际的编码过程中对SubList不了解,误将subList当成了一个全新的ArrayList,这就有可能因为GC无法回收之前的原始List而导致OOM异常。

    59420发布于 2020-08-11
  • 来自专栏CSDNToQQCode

    List中subList方法抛出异常java.util.ConcurrentModificationException原理分析

    ,我们来一探究竟; 接下来我们首先看一下ArrayList中对subList()方法的实现的源码,看它究竟干了些什么事儿: 在subList()方法的源码中首先调用了 subListRangeCheck , toIndex),返回了一个SubList对象,继续往下看一下这个SubList对象,源码在1010行: 通过源码可以看到,这个SubList对象是一个内部类, 2.1、在构造对象时,会传入4个参数 :结束下标(不包含) 2.2、在构造器内部: 将传入的parent赋给SubList对象的成员变量parent; fromIndex赋给SubList对象的成员变量parentOffset; offset +fromIndex赋给SubList对象的成员变量offset,用于记录元素的偏移量; toIndex - fromIndex赋给SubList对象的成员变量size,用于记录此时会返回的数据量大小; 最后一个是 ArrayList.this.modCount 赋给SubList对象的成员变量modCount ,这个赋值比较关键,记录了修改过的次数,默认为0; 到这里,构造一个SubList对象就完成了

    1K40编辑于 2022-11-29
  • 来自专栏测试技术圈

    测试技术修为:测试应该关注java.util.List.subList的坑

    java中有一个返回子列表的方法: public list<E> subList(int fromIndex, int toIndex){ subListRangeCheck(fromIndex , toIndex,size); return new SubList(this , 0, fromIndex, toIndex); } 返回一个fromIndex为起点,toIndex为终点 这也导致了,如果针对原来的list或者是sublist返回的list的修改(这里的修改是不涉及list大小),都是对同一段内存存储的数据做修改。 如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用。 特别提醒:在使用sublist部分的白盒测试要重点对上述情况做测试。

    32810发布于 2019-08-02
  • 来自专栏Java进阶架构师

    在项目中用了Arrays.asList、ArrayList的subList,被公开批评

    使用ArrayList的subList的注意事项 先来看下subList的简单使用: List<String> bookList = new ArrayList<>(); bookList.add("遥远的救世主 (3, 5); System.out.println(bookList); System.out.println(luyaoBookList); 运行结果如下图所示: 从运行结果可以看出,subList 2.5 原因分析 首先,我们看下subList方法的注释,了解下它的用途: Returns a view of the portion of this list between the specified , size); return new SubList(this, 0, fromIndex, toIndex); } 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示: 可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

    50340发布于 2021-04-21
  • 来自专栏Java note

    CTO:谁在项目中使用Arrays.asList、ArrayList.subList,就立马滚蛋!

    你好,我是大彬 今天跟大家分享Arrays.asList、ArrayList.subList的使用。 1. 使用ArrayList的subList的注意事项 先来看下subList的简单使用: List<String> bookList = new ArrayList<>(); bookList.add("遥远的救世主 (3, 5); System.out.println(bookList); System.out.println(luyaoBookList); 运行结果如下图所示: 从运行结果可以看出,subList , toIndex, size); return new SubList(this, 0, fromIndex, toIndex); } 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示 : 可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

    36110编辑于 2023-12-14
  • 来自专栏飞天小牛肉

    踩坑分享|终于明白为啥面试老是有人问 subList 了,原来这玩意会 OOM!

    再来做个实验看下: 首先初始化一个包含数字 1 到 10 的 ArrayList,然后通过调用 subList 方法取出 2、3、4,随后删除这个 SubList 中的元素数字 3。 分析 subList 方法可以看到,获得的 List 其实是创建了一个内部类 SubList,并不是普通的 ArrayList。 而且 SubList 强引用了原始的 List,所以大量保存这样的 SubList 其实也保存了大量原始的 List,从而导致 OOM。 综上,既然 SubList 和原始 List 会相互影响,那么避免相互影响的修复方式有两种: 不直接使用 subList 方法返回的 SubList,而是重新使用 new ArrayList,在构造方法传入 SubList,来构建一个独立的 ArrayList: List<Integer> subList = new ArrayList<>(list.subList(1, 4)); 对于 Java 8

    65010编辑于 2024-03-22
  • 来自专栏JAVA葵花宝典

    在项目中用了Arrays.asList、ArrayList的subList,被公开批评

    使用ArrayList的subList的注意事项 先来看下subList的简单使用: List<String> bookList = new ArrayList<>(); bookList.add("遥远的救世主 图片 从运行结果可以看出,subList返回的是bookList中索引从fromIndex(包含)到toIndex(不包含)的元素集合。 ” 然后,我们看下它的源码: public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex); } 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示 图片 可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

    46240发布于 2021-06-17
  • 来自专栏终有链响

    Redis反序列化错误Could not read JSON: Cannot construct instance of `java.util.ArrayList$SubList`

    Redis反序列化错误Could not read JSON: Cannot construct instance of java.util.ArrayList$SubList 解决思路 Cannot 是没有关键标记常量 private static final long serialVersionUID = -3911255650485738676L; 我看这两个都没问题啊,那可能是我业务中用了一个 list.subList 看看.sublist()源码,果然没有实现Serializable 可序列化接口,附上源码 解决方案: 既然问题找到啦,是没有序列化导致的,那咱们就序列化一个就是呗。 new ArrayList() list = new ArrayList<EmailInfo>(list.subList(1, list.size()));

    46610编辑于 2024-07-29
领券