,又见面了,我是你们的朋友全栈君 /************************************************/ List tempList = lists.subList...********************************************/ 如果List tempList = new ArrayList(lists.subList.../************************************************/ lists.subList(2, lists.size()).clear(); lists的clear...()方法会把sublist截取的集合部分从lists中移除掉。
本文研究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.
技术背景 在日常开发中,我们常遇到将一个List列表分割成多个的场景,List提供了subList()方法避免开发者重复造轮子。...subList()的用法 ArrayList类是接口List的一个实现,以下subList()使用方法参考示例来自ArrayList。...(0, 1); System.out.println(subString); 输出: [hello] subList实现 ArrayList的subList()源码如下: public List... subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return...new SubList(this, offset, fromIndex, toIndex); } SubList类是ArrayList的一个内部类,它继承自AbstractList抽象类,在SubList
(AsListTest.java:25) 2.源码分析 可以看到,在subList产生的新的子集之后,我们对subList进行了set操作,之后再对list本身执行操作。...2.1 subList方法源码 在ArrayList中,subList是ArrayList的一个内部类。...2.2 SubList类源码 private class SubList extends AbstractList implements RandomAccess { private final...也就是说,SubList本身并不是创建了一个新的ArrayList。而是一个新的视图类SubList。这个类还不能强转为ArrayList。...4.正确的打开方式 如果我们需要subList的这个子集,同时又不想对原有的ArrayList造成影响,那么我们可以对这个新的subList进行拷贝。这就类似于一个CopyOnRead。
,操作 subList List 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 字段值是否相等,如果不相等则抛出异常
使用ArrayList的subList的注意事项 先来看下subList的简单使用: List 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,所以修改原集合或者子集合的元素的值,是会相互影响的。
使用ArrayList的subList的注意事项 先来看下subList的简单使用: List bookList = new ArrayList(); bookList.add("遥远的救世主...在这里插入图片描述 从运行结果可以看出,subList返回的是bookList中索引从fromIndex(包含)到toIndex(不包含)的元素集合。...2.5 原因分析 首先,我们看下subList方法的注释,了解下它的用途: ?..., size); return new SubList(this, 0, fromIndex, toIndex); } 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示...参考 谨慎使用ArrayList中的subList方法 《阿里巴巴Java开发手册》泰山版
ArrayList分析2 : Itr、ListIterator以及SubList中的坑 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/16409137.html...,尤其在SubList表现的尤为严重~ 先看看ArrayList的subList方法定义: public List subList(int fromIndex, int toIndex)..., toIndex); } 可以看到subList方法返回的是SubList的一个实例,好,继续看构造函数定义: private class SubList extends AbstractList...返回的是一个深度拷贝的数组,哪知SubList与ArrayList内部都是一家人(elementData),所以在使用subList的函数时要谨记这一点,当然咯,既然SubList也是继承自AbstractList...,subList返回的数组也能继续调用subList方法,内部操作的数组也是一样,是不是很吊诡 二.ListItr的previous方法不太好用 其实这是个小问题,我是基于以下两点来判断的. 1.使用迭代器的习惯
---- Arrays.subList 规则 ? ?...---- Code 基本使用 /** * subList的注意事项 */ public static void subList(){ List subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex..., size); return new SubList(this, 0, fromIndex, toIndex); } 重点看 new SubList(this, 0, fromIndex...可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。
上一篇中提到subject是一种Trie树,在实现的过程中发现非常琐碎,也不好讲解,因此考虑先实现一个简单版本的.具体来说就是
java中有一个返回子列表的方法: public list 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部分的白盒测试要重点对上述情况做测试。
---- 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生成的子列表只是原列表的一个视图而已
关于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异常。
,我们来一探究竟; 接下来我们首先看一下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对象就完成了
使用ArrayList的subList的注意事项 先来看下subList的简单使用: List 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,所以修改原集合或者子集合的元素的值,是会相互影响的。
你好,我是大彬 今天跟大家分享Arrays.asList、ArrayList.subList的使用。 1....使用ArrayList的subList的注意事项 先来看下subList的简单使用: List 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,所以修改原集合或者子集合的元素的值,是会相互影响的。
再来做个实验看下: 首先初始化一个包含数字 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 subList = new ArrayList(list.subList(1, 4)); 对于 Java 8
使用ArrayList的subList的注意事项 先来看下subList的简单使用: List bookList = new ArrayList(); bookList.add("遥远的救世主...图片 从运行结果可以看出,subList返回的是bookList中索引从fromIndex(包含)到toIndex(不包含)的元素集合。...” 然后,我们看下它的源码: public List subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex,...toIndex, size); return new SubList(this, 0, fromIndex, toIndex); } 可以看到,它调用了SubList类的构造函数,该构造函数的源码如下图所示...图片 可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。
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(list.subList(1, list.size()));
领取专属 10元无门槛券
手把手带您无忧上云