我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?

这个还不简单,几行代码就可以了

1. 测试验证

上面的代码先不考虑性能的优化方面,有没有问题?

写了个简单的测试case,我们来看下会出现什么情况

动参数修改下,添加jvm最大内存条件 -Xmx3m, 然后跑上面代码,一段时间之后居然出现stack over flow

sof

有意思的问题来了,从逻辑上看,这个数组固定长度为20,顶多有21条数据,怎么就会内存溢出呢?

2. SubList 方法揭秘

我们看下ArrayList#sublis方法的实现逻辑,就可以发现获取子列表,居然只是重置了一下内部数组的索引

返回的是一个SubList类型对象,这个对象和原来的List公用一个存储数据的数组,但是多了两个记录子列表起始的偏移;

然后再看下SubList的add方法,也是直接在原来的数组中新增数据,想到与原来的列表在指定位置插入数据

所以上面实现的代码中 list = list.subList(0, 20); 这一行,有内存泄露,貌似是只返回了一个20长度大小的列表,但是这个列表中的数组长度,可能远远不止20

为了验证上面的说法,debug下上面的测试用例

3. 正确使用姿势

上面知道sublist并不会新创建一个列表,旧的数据依然还在,只是我们用不了而已,所以改动也很简单,根据sublist的结果创建一个新的数组就好了

再次测试,代码一直在顺利的执行,看下后面的计数,都已经5w多,前面1w多久报错了

虽然上面解决了内存泄露,但是gc也很频繁了,本篇的重点主要是指出sublist的错误使用姿势,所以上面算法的优化就不详细展开了

4. 知识点扩展

看下下面的测试代码输出应该是什么

再看具体的答案之前,先分析一下

针对case1/2,我们知道sublist返回的列表和原列表公用一个底层数组,所以这两个列表的增删,都是相互影响的

  • case1 执行之后相当于在list数组的下标15这里,插入数据100
  • case2 执行之后,list的下标11,相当于sub的下标1,也就是说sub[1] 变成了200

对于case3/4 而言,根据sub创建了一个新的列表,这个时候修改新的列表中的值,会影响到原来的列表中的值么?

分析这个场景,就需要看一下源码了

从上面的源码分析,会不会相互影响就看这个数组拷贝是怎么实现的了(深拷贝?浅拷贝?)


接下来看下实际的输出结果

list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 100, 15, 16, 17, 18, 19]

sub: [10, 11, 12, 13, 14, 100]

list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 200, 12, 13, 14, 100, 15, 16, 17, 18, 19]

sub: [10, 200, 12, 13, 14, 100]

list: [10, 200, 12, 13, 14, 100]

sub: [999, 200, 12, 13, 14, 100]

list cl: [BasicTest.InnerC(name=a, id=1), BasicTest.InnerC(name=a5, id=5), BasicTest.InnerC(name=a3, id=3), BasicTest.InnerC(name=a4, id=4)]

list cl2: [BasicTest.InnerC(name=a5, id=5), BasicTest.InnerC(name=a3, id=3)]

从上面可以知道,case1/2的分析没啥问题,case3、4的输出有点意思了

  • 数组内为Integer时,两者互不影响
  • 数组内为普通对象时,修改其中一个,会影响另外一个

关从输出结果来看 System.arraycopy 是浅拷贝,至于为什么int不影响呢,这个就和方法调用传参是基本数据类型时,在方法内部修改参数不会影响到外部一个道理了

II. 其他

1. 一灰灰Blog: https://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog
  • QQ: 一灰灰/3302797840

sublist方法_老哥你真的知道ArrayList#sublist的正确用法么相关推荐

  1. java list sublist方法_(转)Java 中 List.subList() 方法的使用陷阱

    原文:http://blog.csdn.net/cleverGump/article/details/51105235 前言 本文原先发表在我的 iteye博客: http://clevergump. ...

  2. java list sublist方法_聊聊ArrayList中的subList方法

    开发过程中遇到的坑 开发过程经常会使用subList做分页处理. 比如下面的代码 while(pageIndex < maxSize) { List temp = userIds.subList ...

  3. 我的世界java肥料桶_我的世界:堆肥桶太垃圾?老MC告诉你5个它的“正确用法”!...

    "堆肥箱"又叫做"堆肥桶",是1.14新加入的道具,主要用于产骨粉,目前基岩版已经更新了,只是功能还不具备,在JAVA版本才能见到完整的堆肥桶. 说起这个&qu ...

  4. 覆盖分类的方法_老罗讲分类|垃圾分类回收模式到底用哪种好?

    普通桶?垃圾房?智能设备?关于垃圾分类的回收模式,到底用哪种模式好? 不管是普通垃圾桶,垃圾房,还是智能的垃圾分类回收设备,老罗认为,不管采用哪种垃圾分类回收模式,首先都要让居民可以非常清楚地知道垃圾 ...

  5. C# 子类实例化基类 基类使用不了子类的方法_老话题:6个方法,检验你有没有正确使用设计模式...

    方法一:设计模式是为了消除继承 大部分设计模式,是让你在在面向对象的基础上尽量消除继承的手段.所以,如果你用了一些设计模式,减少了继承,那你八成用对了.如果你用了一大堆设计模式,然而继承却越来越频繁, ...

  6. 一位老哥写文怒刚 Redis 作者

    这篇文章是关于 Redis 的一个技术类小八卦,我看完直呼 666. 这文之前发过,不过没多少人看到,并且现在我的观点也发生了点变化,所以重新修改一波. 开始表演 我无意间查到一位叫 mattsta ...

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

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

  8. 使用ArrayList中的subList方法

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

  9. (超详细笔记整理)动力节点_老杜 | JavaSE零基础 :P329(方法) - P479

    JAVA基础学习 第二篇文章的连接: (超详细笔记整理)动力节点_老杜 | JavaSE进阶 [P486之后]. 文章目录 JAVA基础学习 方法 Java的主要内存空间 栈数据结构 **栈数据结构: ...

最新文章

  1. 解决删除U盘时提示无法停止‘通用卷’设备的方法
  2. 归并排序树状数组求逆序数
  3. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
  4. founder of girton college
  5. Trie(字典树) : 如何实现搜索引擎的关键词提示功能?
  6. AndroidMainfest.xml具体解释——lt;activitygt;
  7. Linux下在tomcat上部署项目
  8. 20190616 IDEA-每次修改JS文件都需要重启Idea才能生效解决方法
  9. Sklearn专题实战——数据处理+模型构建+网格搜索+保存(提取)模型
  10. IDEA启动Tomcat 中文乱码问题
  11. Oracle备份与恢复-误删数据文件恢复(非归档模式)
  12. 网易测试工程师笔经面经(已上岸)
  13. 12种编程语言训练,开源的AI “程序员”来了,CMU出品
  14. 导数,偏导数,方向导数,梯度的理解---微积分数学基础
  15. 贵有恒,何必三更起五更眠;最无益,只怕一日曝十日寒
  16. java http请求发送unicode_c++ 使用httpclient获取网页及utf8与unicode之间转码
  17. Ant Chmod命令详解
  18. vdbench 配置案例及参数说明
  19. 内码转换技术 (转)
  20. Chem 3D软件可以改变背景吗

热门文章

  1. 从鸿蒙发布看互联网周边生态,拍照性能双升级 倪妮代言vivo X9s上手体验
  2. 这样设置,让你的IDEA好用到爆
  3. 快过年了,奉上好玩游戏“劲爆弹球3”
  4. 吃鸡什么耳机听声辨位比较好?游戏入耳式耳机推荐
  5. MaterialDesign系列文章(十一)Google2018年大会新出的控件汇总集合
  6. 一些问题的答案记录 (持续更新中)
  7. 【Flink】Flink分布式缓存
  8. 高通SDM450 副屏mipi转EDP
  9. 2013-03-05 By dapps  苹果应用商店AppStore审核中文指南(译本)
  10. ISOCOM NEXTCHIP NVP6324 N4