首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Java|List.subList 踩坑小记

,操作 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 字段值是否相等,如果不相等则抛出异常

19440

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

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.使用迭代器的习惯

31230

【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生成的子列表只是原列表的一个视图而已

69870

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对象就完成了

64040

在项目中用了Arrays.asList、ArrayList的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,所以修改原集合或者子集合的元素的值,是会相互影响的。

36540

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

你好,我是大彬 今天跟大家分享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,所以修改原集合或者子集合的元素的值,是会相互影响的。

10910

踩坑分享|终于明白为啥面试老是有人问 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 subList = new ArrayList(list.subList(1, 4)); 对于 Java 8

9510

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

使用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,所以修改原集合或者子集合的元素的值,是会相互影响的。

32340
领券