开发过程中遇到的坑

开发过程经常会使用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. MAC 下 安装redis 并配置 php redis 扩展
  2. 三巨头垄断全球农业-丰收节贸易会:世界最大种子农药公司
  3. CVE-2019-0708(BlueKeep)漏洞分析与复现
  4. H5禁止弹窗页面滚动
  5. Video : 将使用AD认证的SharePoint网站配置为表单方式登录
  6. java如何获得相反的颜色_javascript – 如何根据当前颜色生成相反的颜色?
  7. .net 获取xml里面的值_Java-XML技术
  8. 转:从内部开始 认识Oracle数据库结构组件
  9. QQ互联--个人资料提交审核
  10. win10系统,安装Photoshop_CS6并且无需序列号破解
  11. 手游运营数据监控指标浅谈
  12. cspm2——T2 HRZ学英语
  13. IT职场人生:学外语
  14. Unity插件篇:Pocket RPG Weapon Trails(武器拖尾特效)部分解读以及基本用法
  15. 2018年8月24日英语学习
  16. 上海宝付房价上涨?这几类人倒霉了
  17. (已失效):谷歌浏览器下载速度慢?推荐一款插件给你
  18. 测试之道——阿里巴巴八年测试专家倾情奉献
  19. 心情不好的时候,就去做这5件事
  20. Java算法(八)详细解析:寻找完数

热门文章

  1. qq修改实名认证已达上限_英雄联盟健康系统实名认证修订指引
  2. html去掉div的边框,javascript中如何去掉div的边框?
  3. 推荐两种开发者独立博客域名起名方式
  4. “合购团体票”问题设计与结论思考
  5. 【Ecstore2.0】计划任务/队列/导入导出 的执行问题
  6. 【论文笔记】Feature Pyramid Networks for Object Detection
  7. 苹果推出智能音箱Homepod
  8. R语言对爬取的天气数据进行整理
  9. tableau制作四象限图、标靶图
  10. FLUX WMS 自定义面单打印