您现在的位置是:首页 > 数码 > 

sublist方法

2025-07-27 14:11:31
sublist方法 我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?这个还不简单,几行代码就可以了1. 测试验证上面的代码先不考虑性能的优化方面,有没有问题?写了个简单的测试case,我们来看下会出现什么

sublist方法

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

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

1. 测试验证

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

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

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

sof

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

2. SubList 方法揭秘

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

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

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

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

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

. 正确使用姿势

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

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

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

4. 知识点扩展

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

II. 其他

1. 一灰灰Blog:

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

2. 声明

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

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

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/857215.html

相关标签:无
上传时间: 2024-02-10 09:50:56
留言与评论(共有 9 条评论)
本站网友 氢电池
4分钟前 发表
100
本站网友 抚顺月牙岛
8分钟前 发表
id=)
本站网友 史大嘴
29分钟前 发表
17
本站网友 古城房屋出租
5分钟前 发表
id=)]从上面可以知道,case1/2的分析没啥问题,case
本站网友 美国降息
27分钟前 发表
14
本站网友 310s不锈钢
24分钟前 发表
15
本站网友 豪杰春香插曲
13分钟前 发表
8
本站网友 曼陀罗花的功效
24分钟前 发表
8