开发过程中遇到的坑

开发过程经常会使用subList做分页处理。

比如下面的代码

while(pageIndex < maxSize) {

List temp = userIds.subList(pageIndex, (pageIndex + pageSize) > maxSize ? maxSize : (pageIndex + pageSize));

processWechatReserve(temp, unBingdingUserIdList, trueLiveId);

}

private void processWechatReserve(List tempUserIdList, List unBingdingUserIdList, Long targetId){

if (CollectionUtils.isNotEmpty(tempUserIdList) && CollectionUtils.isNotEmpty(unBingdingUserIdList)) {

tempUserIdList.removeAll(unBingdingUserIdList);

当变量unBingdingUserIdList有内容时,

这段代码就会报错IndexOutOfBoundsException。

其实写代码时大家都知道subList是原List的一个视图,

对subList的操作会体现到原List上。

但万万没想到的是调用的方法签名是这样的

processWechatReserve(List, List){

也就是说,实现processWechatReserve方法的人可能并不知道List的来源是subList,此时就很容易出错。

就着本次的问题,萌新也总结了一下使用subList的一些注意事项。

一些例子

1. 元素范围

List subList(int fromIndex, int toIndex)

该方法所取的元素下标为fromIndex至toIndex-1

public List subList(int fromIndex, int toIndex) {

subListRangeCheck(fromIndex, toIndex, size);

return new SubList(this, 0, fromIndex, toIndex);

}

SubList(AbstractList parent,

int offset, int fromIndex, int toIndex) {

this.parent = parent;

this.parentOffset = fromIndex;

this.offset = offset + fromIndex;

this.size = toIndex - fromIndex;

this.modCount = ArrayList.this.modCount;

}

parentOffset就是指向原list

2. 修改

父子list做的非结构性修改(non-structural changes)都会影响到彼此:所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。

List list = Lists.newArrayList(1, 3, 5);

List subList = list.subList(0, 1);

subList.set(0, -1);

System.out.println(list);

System.out.println(subList);

[-1, 3, 5]

[-1]

对于结构性修改,子list的所有操作都会反映到父list上。但父list的修改将会导致返回的子list失效。

List list = Lists.newArrayList(1, 3, 5);

List subList = list.subList(0, 1);

subList.remove(0);

System.out.println(list);

System.out.println(subList);

[3, 5]

[]

List list = Lists.newArrayList(1, 3, 5);

List subList = list.subList(0, 1);

list.remove(0);

System.out.println(list);

System.out.println(subList);

[3, 5]

对subList对访问会报异常ConcurrentModificationException

原因:

原list的modCount为4,而subList的modCount为3。

3. 如何删除list中的某段数据:

list.subList(from, to).clear();

如何避免

如果需要对subList作出修改,又不想动原list。那么可以创建subList的一个拷贝

subList = Lists.newArrayList(subList);

list.stream().skip(strart).limit(end).collect(Collectors.toList());

此刻,我竟然想到了《阿里巴巴Java开发手册》上面有两个提醒与此相关。

纸上得来终觉浅,绝知此事要躬行。

哭出声。。。

2. 【强制】ArrayList的subList结果不可强转成ArrayList,

否则会抛出ClassCastException 异常,

即java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。

说明:subList 返回的是 ArrayList 的内部类 SubList,

并不是 ArrayList 而是 ArrayList 的一个视图,

对于 SubList 子列表的所有操作最终会反映到原列表上。

3. 【强制】在 subList 场景中,高度注意对原集合元素的增加或删除,

均会导致子列表的遍历、 增加、删除产生ConcurrentModificationException 异常。

java list sublist方法_聊聊ArrayList中的subList方法相关推荐

  1. java list 元素排序_对arraylist中元素进行排序实例代码

    rrayList中的元素进行排序,主要考查的是对util包中的Comparator接口和Collections类的使用. 实现Comparator接口必须实现compare方法,自己可以去看API帮助 ...

  2. bootstrap方法_中介效应中的bootstrap方法

    当我们有如上图所示的中介模型时,x--m的系数为0.1,m--y的系数也为0.1,这两个系数是显著的.但是0.1*0.1=0.01,此时中介效应还是显著的吗? 为了解决这个问题,有人提出只要两条路径都 ...

  3. java ArrayList中的subList方法

    2019独角兽企业重金招聘Python工程师标准>>> 本文是本人的学习笔记,把自己的理解总结记录下来.因本人水平有限,如果您在阅读中发现错误,还望谅解,并且希望能够告知本人改正,不 ...

  4. java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at

    [http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...

  5. 原创 | 为什么阿里巴巴要求谨慎使用ArrayList中的subList方法

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 219 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 集合是Java开发日 ...

  6. 使用ArrayList中的subList方法

    集合是Java开发日常开发中经常会使用到的.在之前的一些文章中,我们介绍过一些关于使用集合类应该注意的事项,如<为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作 ...

  7. java arraylist 常用方法_分享ArrayList中的几个常用方法的源码

    jdk1.7.0_79 上文里解析了有关ArrayList中的几个常用方法的源码--<有关ArrayList常用方法的源码解析>,本文将对LinkedList的常用方法做简要解析. Lin ...

  8. java 循环遍历字符串_遍历字符串中所有字符的最快方法

    第一个更新:在生产环境(不建议使用)中尝试此方法之前,请先阅读以下内容:http : //www.javaspecialists.eu/archive/Issue237.html 从Java 9开始, ...

  9. java list 内存释放_java集合ArrayList中clear方法内存释放分析

    最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...

最新文章

  1. System.Diagnostics.Process.Start()
  2. [数据结构-严蔚敏版]P95矩阵压缩-特殊矩阵的存储(对称矩阵,三角矩阵)
  3. 【Git、GitHub、GitLab】一 Git安装与Git最小配置
  4. 文本文件和二进制文件的区别
  5. 微服务的好处与弊端_一文了解微服务的流程和组织
  6. 数据科学入门的5个技巧
  7. day 107radis非关系型数据库
  8. DotNetBar.Bar图标列表的使用
  9. RHEL 5服务篇—LAMP平台的部署及应用
  10. python怎么做q检验_python – 如何检测pyside2中Qwebengine内部的按钮单击
  11. Zynq-7000基于zynq平台裸跑LWIP协议栈的详解(万字长文)
  12. 二路归并排序和多路归并排序
  13. C#实现图片转字符画
  14. 基于MinimaxAlpha-Beta剪枝和强化学习的播棋(Mancala)AI
  15. tp5实现126邮件服务
  16. SQL Server 数据库之数据完整性
  17. 盘点国内6大抗DDOS攻击服务商
  18. (搞笑)经典!一些很彪悍的句子 !!
  19. 美术2.4 UV原理基础
  20. LDP协议的相关内容

热门文章

  1. 3.2 HTML中级 - 常用标签(上) | html5教程,html高频常用标签,html教程,html css,html5,html模板
  2. python实现最大堆,最小堆和堆排序
  3. .Net开源SqlServer ORM框架SqlSugar整理
  4. python爬虫详细笔记
  5. 【转】测试-从农历生日看你一生大运
  6. 小肩膀POST+JS第三期(价值1000元)_高清带源码
  7. python 基础 字符串烧烤流程
  8. 软件、系统和平台的区别
  9. 用php语言说句情话,2019快手情话短句推荐 让对方心瞬间融化的情话句子
  10. LeetCode Algorithm 2326. 螺旋矩阵 IV