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

相关内容

热门资讯

原创 谈... 一家澳洲矿业巨头,突然被宣告——你在中国港口堆积的七百多万吨货,别想动了。这不是关税战,也不是外交场...
2026年成都起泡果酒市场:大... 起泡果酒是低酒精度果汁发酵饮品中,以二次发酵或充气工艺保留碳酸口感的一类产品。2026年,起泡果酒行...
输球又输人!巴拉圭将足球场变拳... 北京时间7月5日,在美加墨世界杯1/8决赛法国1-0小胜巴拉圭的比赛中,费城体育场见证了一场粗野球风...
脑瘤手术后,放疗是“必选项”吗... 大家好,我是纪跃廷主任。 放疗不是所有脑瘤术后的“必选项”,但对很多患者来说,它确实是决定预后的关键...
有人喊话奈雪的茶董事长赵林拿1... 来源:运营商财经网 运营商财经网 食品酒业频道 周颖/文 近日,奈雪的茶召开股东周年大会,有投资者描...
原创 财... 随着英国财政危机持续发酵,工党内部的财政政策裂痕已彻底浮出水面。英国首相热门人选、候任工党领袖安迪·...
涉及680万股东!A股下周一正... 文/帅可聪 下周一(7月6日)起,沪深交易所主板风险警示股票(ST股)涨跌幅限制将上调至10%。 今...
2025-2000上市公司医药... 本人将中国上市公司医药数据精心整理为面板数据的形式,医药企业具有471家,5972多个样本,无论是做...
汇川技术:PLC已形成完整系列... 来源:问董秘 投资者提问: 董秘,您好:想问一下贵司在大中型PLC的研发投入和技术发展现在处于什么阶...
原创 董... 昨晚天津卫视黄金档突然上线的《花开如梦》,像是从时间缝隙里掉出来的一部剧,让不少守在电视机前的观众一...
和讯高璐明:突发!券商爆利好!... 券商爆利好,业绩大幅飙升,创历史新高,那么到底对于下周市场会产生多大影响?券商板块未来还有没有上攻的...
国足短期内不会与佛得角交手 近期,关于佛得角可能与国足来一场友谊赛的消息备受关注。 在与阿根廷队赛前,佛得角队首发阵容合影。图...
BC技术接棒、钙钛矿叠层技术蓄... 本报记者 殷高峰 张晓玉 “现阶段光伏项目招标,不配备BC(背接触)组件,基本很难进入业主采购短名单...
原创 海... 新华社德黑兰7月4日电,伊朗伊斯兰革命卫队迎来关键人事变动,阿里·阿兹玛伊少将出任革命卫队海军司令。...
金属3D打印火箭厂商Rocke... 长三角G60激光联盟导读:国外的金属3D打印火箭厂商Rocket Lab,发展速度之快就像坐上了火箭...
嘴歪眼斜是什么病前兆 嘴歪眼斜一般情况下是面瘫、脑卒中、脑梗死等疾病的前兆。 1、面瘫:通常是因为感染因素,也有可能是因为...
上海建工:获政府补助3.48亿... 根据《企业会计准则第16号——政府补助》相关规定,公司将上述与收益相关的政府补助确定为“其他收益”并...
李彦宏最大IPO来了 窗口期。 作者/吴琼 报道/投资界PEdaily “份额抢不到。” 这一幕正在出现在昆仑芯身上。自年...
万全区召开传统制造业数字化升级... 来源:厚德万全 7月3日,万全区召开传统制造业数字化升级与电子商务发展座谈会。区政协、区商务局、...
原创 德... 在全球经济的复杂棋局中,近期德国总理默茨对人民币汇率的言论引发了不小的波澜。他声称人民币“低估了30...