List subList()方法缺陷及替代方案
admin
2024-05-11 06:31:04
0

技术背景

在日常开发中,我们常遇到将一个List列表分割成多个的场景,List提供了subList()方法避免开发者重复造轮子。

subList()的用法

ArrayList类是接口List的一个实现,以下subList()使用方法参考示例来自ArrayList

		List arrayList = new ArrayList<>();arrayList.add("hello");arrayList.add("hello1");arrayList.add("hello2");arrayList.add("hello3");List subString = arrayList.subList(0, 1);System.out.println(subString);

输出:

[hello]

subList实现

ArrayListsubList()源码如下:

public List subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList(this, offset, fromIndex, toIndex);
}

SubList类是ArrayList的一个内部类,它继承自AbstractList抽象类,在SubList的构造方法中,入参有原始list的引用,SubList类的get方法源码如下:

//ArrayList的原始数组 
transient Object[] elementData; @SuppressWarnings("unchecked")
E elementData(int index) {return (E) elementData[index];
}/*** Returns the element at the specified position in this list.** @param  index index of the element to return* @return the element at the specified position in this list* @throws IndexOutOfBoundsException {@inheritDoc}*/
public E get(int index) {rangeCheck(index);return elementData(index);
}

可以看到,SubListget()方法是通过下标来获取原数组的数据,而不是返回一个新的对象,当代码中有对分割后的列表访问时,便是对原ArrayList的引用,导致该对象不会被GC回收,数据量大时,有导致OOM的风险。因此,我们需要找到新的方案去解决代码中的风险点。

解决方案

使用Stream的方式分割。

通过skip()方法获取某个元素节点之后的数据
//获取第2个节点后的数据(包含第2个元素)
List skipList = arrayList.stream().skip(1).collect(Collectors.toList());

输出:

[hello2, hello3]

通过limit()方法获取某个元素节点之前的数据
//获取第2个节点前的数据
List limitList = arrayList.stream().limit(1).collect(Collectors.toList());

输出:

[hello]

其他解决方案
  • guava的Lists.partition()
  • apache的ListUtils.partition()

详细方案请参考:

https://juejin.cn/post/7029519771670413325

相关内容

热门资讯

广发银行全力打造服务粤港澳大湾... 建设粤港澳大湾区是国家重大区域发展战略。随着大湾区加快迈向国际一流湾区与世界级城市群,金融作为资源配...
北京抖音代运营代运营公司 1数字内容生产链中的专业化环节 在数字营销的生态中,存在一类专门负责内容平台账号系统性管理与内容...
2026年618有哪些值得关注... 先说一个容易被忽视的事实:618期间选返利平台,和日常选平台的标准完全不同。 日常购物,你关注的是返...
原创 今... 5月16日,国内黄金价格继续往下走,多家品牌金店的足金报价已经跌到1400元附近,比前一天低了十几元...
2026年华林电力专业配电柜批... 电力设备制造领域的品质标杆:深度解读一家专业企业的成长密码 配电柜如同电力系统的"神经中枢",其...
大调仓!伯克希尔开启后巴菲特时... 根据伯克希尔-哈撒韦公司15日向美国证券交易委员会提交的持仓文件,今年第一季度,公司对投资组合进行大...
原创 特... 图 | 美国总统特朗普 美国人突然发现了一个尴尬的现实,即中国不好啃,而欧洲却更像是一块摆在桌上的肥...
索罗斯基金一季度大举调仓!建仓... 日前,索罗斯基金(Soros Fund Management)向美国证券交易委员会(SEC)提交13...
下周外盘看点丨美联储公布会议纪... 本周国际市场风云变幻,全球债市发出危险信号。美股涨跌互现,道指周跌0.17%,纳指周跌0.08%,标...
“肯德基指数”回暖释放消费市场... 你身边肯定有这样的人,或者你本人就是这样: 点外卖先按价格排序,喝咖啡超过9块9就觉得亏了。但商家的...
反杀英伟达!亏损多年却一夜千亿... Cerebras 的纳斯达克上市大戏刚刚落幕,但其引发的连锁反应仍在持续发酵。 5 月 14 日上市...
从大客户依赖到募资补流 军陶科... 上市是一场马拉松! 作者:夏木 编辑:陶然 风品:李毅 来源:首财——首条财经研究院 念念不忘终有回...
原创 人... 近日人民币兑美元汇率持续攀升,先后突破6.8关口,离岸和在岸人民币双双刷新近三年来新高,引发市场高度...
证监会发布新规,11月16日起... 来源:证券日报之声 本报记者 吴晓璐 5月15日,中国证监会发布《衍生品交易监督管理办法(试行)》(...
广州东山口联排别墅集中法拍!9... 日前,位于广州市越秀区江岭下街的实地·紫薇公馆9套别墅,被挂上京东资产交易平台。9套东山口联排别墅起...
原创 黄... 近一年来,不少投资者感叹黄金价格走势的难以捉摸。每当感觉金价已涨至高位,它却往往能再创新高;而当投资...
原创 欧... IEEFA刚刚发布的一份报告,给欧洲引发关注。2021年至2025年间,欧洲从美国进口的液化天然气增...
霍尔木兹海峡,突传大消息!欧洲... 伊朗媒体:欧洲方面已开始就霍尔木兹海峡通行问题与革命卫队接触 伊朗伊斯兰共和国广播电视台16日就霍尔...
海南自贸港“样板间”抢抓开放机... 中新网海口5月16日电 (记者 王子谦)洋浦经济开发区是海南自贸港“样板间”,也是外界观察自贸港建设...
净利增速2.98%,违规频发!... 近期,中信银行2025年年报与2026年一季报接连公布,报告显示,中信银行总资产站稳10万亿元台阶,...