如何正确的截取Java List的subList

这篇具有很好参考价值的文章主要介绍了如何正确的截取Java List的subList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

         最近在生产上,需要用多线程去处理大量的数据,这个数据在一个list里面,为了避免多个线程拉取同一个list造成多次读写,避免资源同步的问题。决定将数据分割,然后就想到了subList(int from,int to)这个方法。但是发现subList 没有根据for循环的位置进行更新,在此对subList方法进行梳理以及记录。

        List接口中有subList(int fromIndex, int toIndex)方法,这个方法返回实现了List接口的SubList的实例,而非当前同类型的实例。Sublist可以简单理解是子List,这个SubList是在AbstractList中定义的,因此只能是包内可见,我们在外面没办法直接访问

        它返回原来list的从[fromIndex, toIndex)之间这一部分的视图,之所以说是视图,是因为实际上,返回的list是靠原来的list支持的。所以,你对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到彼此对方。所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。

        那么,如果涉及到结构性修改会怎么样呢?

        如果发生结构性修改的是返回的子list,那么原来的list的大小也会发生变化;而如果发生结构性修改的是原来的list(不包括由于返回的子list导致的改变),那么返回的子list语义上将会是undefined。在AbstractList(ArrayList的父类)中,undefined的具体表现形式是抛出一个ConcurrentModificationException。因此,如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用。

        如果你对一个 List 进行过 subList() 的操作之后,

        1. 千万不要再对原 List 进行任何改动的操作(例如: 增删改), 查询和遍历倒是可以. 因为如果对原 List 进行了改动, 那么后续只要是涉及到子 List 的操作就一定会出问题. 而至于会出现什么问题呢? 具体来说就是:
        (1) 如果是对原 List 进行修改 (即: 调用 set() 方法) 而不是增删, 那么子 List 的元素也可能会被修改 (这种情况下不会抛出并发修改异常).
        (2) 如果是对原 List 进行增删, 那么此后只要操作了子 List , 就一定会抛出并发修改异常.

        2. 千万不要直接对子 List 进行任何改动的操作(例如: 增删改), 但是查询和间接改动倒是可以. 不要对子 List 进行直接改动, 是因为如果在对子 List 进行直接改动之前, 原 List 已经被改动过, 那么此后在对子 List 进行直接改动的时候就会抛出并发修改异常.

如果想要实现String.split的效果,争取的截取List的subList ,需要按照如下的方法:

List sub=one.subList(...);
List two=new XxxList(sub);
sub.clear();

————————————————
参考链接:https://blog.csdn.net/clevergump/article/details/51105235 文章来源地址https://www.toymoban.com/news/detail-404886.html

到了这里,关于如何正确的截取Java List的subList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 程序如何正确地打印日志?

    在 Java 开发中,打印日志是一项非常重要的工作。正确的打印日志可以帮助我们快速定位问题,并提高代码的可维护性和可读性。本文将为大家介绍 Java 程序如何正确地打日志,希望对大家有所帮助。 一、为什么需要打印日志 在开发过程中,我们经常需要查看程序的运行状

    2024年02月15日
    浏览(29)
  • Java 如何复制 List ?

      List 复制在项目开发时,使用到的频率还是比较高的。List 复制有浅拷贝和深拷贝两种方式。在陈述复制方法前,先总结下什么是浅拷贝和深拷贝(以下内容均站在 Java 语言基础上进行讨论)。 一、什么是浅拷贝(Shallow Copy)和深拷贝(Deep Copy)?   浅拷贝只复制某个对

    2023年04月11日
    浏览(24)
  • 【Java 工具类 Hutool】项目中如何引入 Hutool 并正确使用它

    👉 博主介绍 : 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区 :个人社区 💞 个人主页 :个人主页 🙉 初级进阶地址 : ✅ Java 初级进阶路线 🙉 八股文专题 :

    2024年02月03日
    浏览(33)
  • Java中拷贝list数组如何实现

    要是需要GPT Plus账号的小伙伴可以联系我~ 在Java中,有多种方式可以实现拷贝一个List数组,下面是几种常见的方法: 使用构造函数:可以使用List的构造函数来创建一个新的List,将原始List作为参数传递给构造函数。 使用addAll()方法:可以使用List的addAll()方法将原始List的所有

    2024年02月15日
    浏览(22)
  • Java语言 Iterator 如何装换成 List

    在 Java 中,迭代器(Iterator)是一种用于遍历集合中元素的对象,它提供了一种简单而一致的方式来访问集合中的元素,而不需要暴露集合内部的结构。如果我们需要将一个迭代器逆向转换成 List 集合,可以使用 ListIterator 接口来实现。 ListIterator 接口是 Iterator 接口的子接口,

    2024年02月14日
    浏览(37)
  • ChatGPT之后,下个AIGC杀手级应用已近在眼前

    鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI 大模型模式,正在新一波AIGC的浪潮里被再度验证。 从AI画画的出圈,到现如今ChatGPT的火爆,面向大众的爆款产品接口背后,无不是大模型技术的突破创新。 而当这种“大力出奇迹”的技术路径价值愈发凸显,行业内外也不禁好奇:

    2024年02月10日
    浏览(38)
  • Java8 List集合如何指定打印分隔符

    背景 无论是在学习还是日常的应用开发过程中,我们经常会需要使用分隔符将 List 集合打印出来。 如下所示: 执行结果如下: 如果我们想在打印的时候不打印 [] ,然后将分隔符换成 、 顿号,应该怎么操作呢? 其实有两种方法可以实现: 方法一:String.join(推荐) String

    2024年02月10日
    浏览(37)
  • NetSuite Sublist解释

    今朝汇编一下Sublist主题的知识点以备忘。  Related Record - 以Saved Search建立的关联记录; Child Record - 父子表; Saved Search关键点 这种形式的Sublist是利用Saved Search作为Sublist的数据源,将某个字段作为Key来Join两个表。建立Saved Search时,要点有二: •关联字段类型必须是List/Record类

    2023年04月23日
    浏览(11)
  • java八股文面试[多线程]——为什么要用线程池、线程池参数

     速记7个: 核心、最大 存活2 队列 工厂 拒绝 线程池处理流程: 线程池底层工作原理: 线程复用原理:   知识来源: 【并发与线程】为什么使用线程池,参数解释_哔哩哔哩_bilibili 【并发与线程】线程池处理流程_哔哩哔哩_bilibili 【并发与线程】线程池的底层工作原理_哔哩

    2024年02月11日
    浏览(39)
  • Java——如何使用Stream替换掉List<Student>中符合要求的元素

    要使用Stream流替换掉List中符合特定条件的元素,您可以使用Stream的map()方法对每个元素进行映射,并使用collect()方法将映射后的元素收集到一个新的List中。 示例代码: 在上述示例中,我们定义了一个Student类来表示学生,其中包含姓名和年龄属性。我们创建了一个List对象,

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包