性能对决:LinkedList vs ArrayList,结果出乎意料
jdk版本:1.8
在工作中经常使用 LinkedList
和 ArrayList
,但是什么情况下该使用 LinkedList
,什么情况下该使用 ArrayList
;由于LinkedList
底层存储是链表结构,ArrayList
底层是数组结构。通常建议是ArrayList
适合随机访问,LinkedList适合插入和删除操作,真的是这样的吗,通过单机测试发现这个建议不是很合理,以下是我测试LinkedList
和 ArrayList
的 内存容量占用、get耗时、add耗时、remove耗时、迭代遍历耗时对比结果。
内存占用分析
这里使用了
lucene
工具进行计算集合内存占用。
lucene jar包引入
<dependencies>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
内存占用分析Java代码
List<Object> list = new LinkedList<>();
List<Object> arrayList = new ArrayList<>();
int size = 1;
for (int i = 0; i < 23; i++) {
// 指数级增加容量
size = size * 2;
for (int j = 0; j < size; j++) {
list.add(new Object());
arrayList.add(new Object());
}
System.out.println("capacity size:" + size + ",[LinkedList, ArrayList]:[" + RamUsageEstimator.humanSizeOf(list)
+ "," + RamUsageEstimator.humanSizeOf(arrayList) + "]");
list.clear();
arrayList.clear();
}
运行结果:
用二维图展示: