sublist方法_老哥你真的知道ArrayList#sublist的正确用法么
![](/assets/blank.gif)
我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?
这个还不简单,几行代码就可以了
![](/assets/blank.gif)
1. 测试验证
上面的代码先不考虑性能的优化方面,有没有问题?
写了个简单的测试case,我们来看下会出现什么情况
![](/assets/blank.gif)
动参数修改下,添加jvm最大内存条件 -Xmx3m, 然后跑上面代码,一段时间之后居然出现stack over flow
![](/assets/blank.gif)
sof
有意思的问题来了,从逻辑上看,这个数组固定长度为20,顶多有21条数据,怎么就会内存溢出呢?
2. SubList 方法揭秘
我们看下ArrayList#sublis方法的实现逻辑,就可以发现获取子列表,居然只是重置了一下内部数组的索引
![](/assets/blank.gif)
返回的是一个SubList类型对象,这个对象和原来的List公用一个存储数据的数组,但是多了两个记录子列表起始的偏移;
然后再看下SubList的add方法,也是直接在原来的数组中新增数据,想到与原来的列表在指定位置插入数据
![](/assets/blank.gif)
所以上面实现的代码中 list = list.subList(0, 20); 这一行,有内存泄露,貌似是只返回了一个20长度大小的列表,但是这个列表中的数组长度,可能远远不止20
为了验证上面的说法,debug下上面的测试用例
![](/assets/blank.gif)
3. 正确使用姿势
上面知道sublist并不会新创建一个列表,旧的数据依然还在,只是我们用不了而已,所以改动也很简单,根据sublist的结果创建一个新的数组就好了
![](/assets/blank.gif)
再次测试,代码一直在顺利的执行,看下后面的计数,都已经5w多,前面1w多久报错了
![](/assets/blank.gif)
虽然上面解决了内存泄露,但是gc也很频繁了,本篇的重点主要是指出sublist的错误使用姿势,所以上面算法的优化就不详细展开了
![](/assets/blank.gif)
4. 知识点扩展
看下下面的测试代码输出应该是什么
![](/assets/blank.gif)
再看具体的答案之前,先分析一下
针对case1/2,我们知道sublist返回的列表和原列表公用一个底层数组,所以这两个列表的增删,都是相互影响的
- case1 执行之后相当于在list数组的下标15这里,插入数据100
- case2 执行之后,list的下标11,相当于sub的下标1,也就是说sub[1] 变成了200
对于case3/4 而言,根据sub创建了一个新的列表,这个时候修改新的列表中的值,会影响到原来的列表中的值么?
分析这个场景,就需要看一下源码了
![](/assets/blank.gif)
从上面的源码分析,会不会相互影响就看这个数组拷贝是怎么实现的了(深拷贝?浅拷贝?)
接下来看下实际的输出结果
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)]
![](/assets/blank.gif)
从上面可以知道,case1/2的分析没啥问题,case3、4的输出有点意思了
- 数组内为Integer时,两者互不影响
- 数组内为普通对象时,修改其中一个,会影响另外一个
关从输出结果来看 System.arraycopy 是浅拷贝,至于为什么int不影响呢,这个就和方法调用传参是基本数据类型时,在方法内部修改参数不会影响到外部一个道理了
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
sublist方法_老哥你真的知道ArrayList#sublist的正确用法么相关推荐
- java list sublist方法_(转)Java 中 List.subList() 方法的使用陷阱
原文:http://blog.csdn.net/cleverGump/article/details/51105235 前言 本文原先发表在我的 iteye博客: http://clevergump. ...
- java list sublist方法_聊聊ArrayList中的subList方法
开发过程中遇到的坑 开发过程经常会使用subList做分页处理. 比如下面的代码 while(pageIndex < maxSize) { List temp = userIds.subList ...
- 我的世界java肥料桶_我的世界:堆肥桶太垃圾?老MC告诉你5个它的“正确用法”!...
"堆肥箱"又叫做"堆肥桶",是1.14新加入的道具,主要用于产骨粉,目前基岩版已经更新了,只是功能还不具备,在JAVA版本才能见到完整的堆肥桶. 说起这个&qu ...
- 覆盖分类的方法_老罗讲分类|垃圾分类回收模式到底用哪种好?
普通桶?垃圾房?智能设备?关于垃圾分类的回收模式,到底用哪种模式好? 不管是普通垃圾桶,垃圾房,还是智能的垃圾分类回收设备,老罗认为,不管采用哪种垃圾分类回收模式,首先都要让居民可以非常清楚地知道垃圾 ...
- C# 子类实例化基类 基类使用不了子类的方法_老话题:6个方法,检验你有没有正确使用设计模式...
方法一:设计模式是为了消除继承 大部分设计模式,是让你在在面向对象的基础上尽量消除继承的手段.所以,如果你用了一些设计模式,减少了继承,那你八成用对了.如果你用了一大堆设计模式,然而继承却越来越频繁, ...
- 一位老哥写文怒刚 Redis 作者
这篇文章是关于 Redis 的一个技术类小八卦,我看完直呼 666. 这文之前发过,不过没多少人看到,并且现在我的观点也发生了点变化,所以重新修改一波. 开始表演 我无意间查到一位叫 mattsta ...
- 原创 | 为什么阿里巴巴要求谨慎使用ArrayList中的subList方法
△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 219 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 集合是Java开发日 ...
- 使用ArrayList中的subList方法
集合是Java开发日常开发中经常会使用到的.在之前的一些文章中,我们介绍过一些关于使用集合类应该注意的事项,如<为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作 ...
- (超详细笔记整理)动力节点_老杜 | JavaSE零基础 :P329(方法) - P479
JAVA基础学习 第二篇文章的连接: (超详细笔记整理)动力节点_老杜 | JavaSE进阶 [P486之后]. 文章目录 JAVA基础学习 方法 Java的主要内存空间 栈数据结构 **栈数据结构: ...
最新文章
- 解决删除U盘时提示无法停止‘通用卷’设备的方法
- 归并排序树状数组求逆序数
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
- founder of girton college
- Trie(字典树) : 如何实现搜索引擎的关键词提示功能?
- AndroidMainfest.xml具体解释——lt;activitygt;
- Linux下在tomcat上部署项目
- 20190616 IDEA-每次修改JS文件都需要重启Idea才能生效解决方法
- Sklearn专题实战——数据处理+模型构建+网格搜索+保存(提取)模型
- IDEA启动Tomcat 中文乱码问题
- Oracle备份与恢复-误删数据文件恢复(非归档模式)
- 网易测试工程师笔经面经(已上岸)
- 12种编程语言训练,开源的AI “程序员”来了,CMU出品
- 导数,偏导数,方向导数,梯度的理解---微积分数学基础
- 贵有恒,何必三更起五更眠;最无益,只怕一日曝十日寒
- java http请求发送unicode_c++ 使用httpclient获取网页及utf8与unicode之间转码
- Ant Chmod命令详解
- vdbench 配置案例及参数说明
- 内码转换技术 (转)
- Chem 3D软件可以改变背景吗
热门文章
- 从鸿蒙发布看互联网周边生态,拍照性能双升级 倪妮代言vivo X9s上手体验
- 这样设置,让你的IDEA好用到爆
- 快过年了,奉上好玩游戏“劲爆弹球3”
- 吃鸡什么耳机听声辨位比较好?游戏入耳式耳机推荐
- MaterialDesign系列文章(十一)Google2018年大会新出的控件汇总集合
- 一些问题的答案记录 (持续更新中)
- 【Flink】Flink分布式缓存
- 高通SDM450 副屏mipi转EDP
- 2013-03-05 By dapps 苹果应用商店AppStore审核中文指南(译本)
- ISOCOM NEXTCHIP NVP6324 N4