ArrayList 踩坑

List<String>temp =new ArrayList();
//获取一批数据
List<String>all =getData();
for(String str :all)
{
temp.add(str);
}

 

首先大家看看这段代码有什么问题嘛?

其实在大部分情况下这都是没啥问题,无非就是循环的往 ArrayList 中写入数据而已。

但在特殊情况下,比如这里的 getData() 返回数据非常巨大时后续 temp.add(str) 就会有问题了。

比如我们在 review 代码时发现这里返回的数据有时会高达 2000W,这时 ArrayList 写入的问题就凸显出来了。



填坑指南

大家都知道 ArrayList 是由数组实现,而数据的长度有限;需要在合适的时机对数组扩容。
新的长度=原有长度 * 1.5


数据量特别大的时候,多次的扩容会导致效率底下,建议给array一个初始化的长度。这样可以尽量减少扩容。
如果业务场景写的要求大于读的话,可以考虑用LinkedList


LinkedList 的写入效率高于 ArrayList,所以在写大于读的时候非常适用于 LinkedList 。


12-14 08:06