国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

常见的集合容器应当避免的坑

发布时间:2019/07/11标签:   数组    点击量:

原标题:常见的集合容器应当避免的坑
媒介前未几帮共事一同 review 一个 job 履行迟缓的成绩时,发觉很多友人在撸码完成功效时,仍是有细节不敷留神,因而便有了这篇文章。ArrayList 踩坑Listtemp=newArrayList();//猎取一批数据Listall=getData();for(Stringstr:all){temp.add(str);}起首各人看看这段代码有甚么成绩嘛?实在在大局部情形下这都是没啥成绩,不过就是轮回的往 ArrayList 中写入数据罢了。但在特别情形下,比方这里的 getData() 前往数据十分宏大时后续 temp.add(str) 就会有成绩了。比方咱们在 review 代码时发觉这里前往的数占有时会高达 2000W,这时 ArrayList 写入的成绩就凸显进去了。填坑指南各人都晓得 ArrayList 是由数组完成,而数据的长度无限;须要在适合的机会对数组扩容。这里以拔出到尾部为例 add(E e)。ArrayListtemp=newArrayList<>(2);temp.add("1");temp.add("2");temp.add("3");当咱们初始化一个长度为 2 的 ArrayList ,并往里边写入三条数据时 ArrayList 就得扩容了,也就是将之前的数据复制一份到新的数组长度为 3 的数组中。之以是是 3 ,是由于新的长度=原有长度 * 1.5经过源码,咱们能够得悉 ArrayList 的默许长度为 10。但实在并不是在初始化的时间就创立了 DEFAULT_CAPACITY=10 的数组。而是在往里边 add 第一个数据的时间会扩容到 10。既然晓得了默许的长度为 10 ,那阐明后续一旦写入到第九个元素的时间就会扩容为 10*1.5=15。这一步为数组复制,也就是要从新开发一块新的内存空间寄存这 15 个数组。一旦咱们频仍且数目宏大的停止写入时就会招致很多的数组复制,这个效力是极低的。但假如咱们提早预知了能够会写入几多条数据时,便可以提早幸免这个成绩。比方咱们往里边写入 1000W 条数据,在初始化的时间就给定命组长度与用默许 10 的长度之间机能是差异宏大的。我用 JMH 基准测试,考证以下:@Warmup(iterations=5,time=1,timeUnit=TimeUnit.SECONDS)@Measurement(iterations=5,time=1,timeUnit=TimeUnit.SECONDS)publicclassCollectionsTest{privatestaticfinalintTEN_MILLION=10000000;@Benchmark@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.MICROSECONDS)publicvoidarrayList(){Listarray=newArrayList<>();for(inti=0;i<>array=newArrayList<>(TEN_MILLION);for(inti=0;i<>

上一篇:初识Oracle表空间设置与管理

下一篇:没有了

返回
版权信息Copyright ? IT技术教程 版权所有??? ICP备案编号:鲁ICP备09013610号