结论
ArrayList:一般用于需要查询快、数据量大的中间、尾部插入/删除场景。
LinkedList:一般用于数据量大的头部插入/删除场景。
ArrayList与LinkedList都有其各自的使用场景,如果没法准确区分,就可以使用ArrayList。
一、ArrayList与LinkedList使用场景与耗时分析
1、插入方式:①头部插入;②中间插入;③尾部插入
2、示例代码
package com.example.demo5.test;
import cn.hutool.core.date.StopWatch;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @Author lcb
* @Date 2023/03/16
**/
public class ListCostTimeDemo {
private static final String STRING_PREFIX = "prefix";
public static void main(String[] args) {
testString();
}
private static void testString() {
//头部插入
handle(PositionTypeEnum.HEAD_TYPE, STRING_PREFIX);
//中间插入
handle(PositionTypeEnum.MIDDLE_TYPE, STRING_PREFIX);
//尾部插入
handle(PositionTypeEnum.TAIL_TYPE, STRING_PREFIX);
}
private static void handle(PositionTypeEnum positionTypeEnum, Object prefix) {
System.out.println("==================" + 10000 + "======================");
watchCostTime(10000L, positionTypeEnum, prefix);
System.gc();
System.out.println("==================" + 100000 + "======================");
watchCostTime(100000L, positionTypeEnum, prefix);
System.gc();
System.out.println("==================" + 200000 + "======================");
watchCostTime(200000L, positionTypeEnum, prefix);
System.gc();
System.out.println("==================" + 500000 + "======================");
watchCostTime(500000L, positionTypeEnum, prefix);
System.gc();
if (PositionTypeEnum.HEAD_TYPE.equals(positionTypeEnum)) {
System.out.println("==================" + 1000000 + "======================");
watchCostTime(1000000L, positionTypeEnum, prefix);
}
if (PositionTypeEnum.TAIL_TYPE.equals(positionTypeEnum)) {
System.out.println("==================" + 1000000 + "======================");
watchCostTime(1000000L, positionTypeEnum, prefix);
System.gc();
System.out.println("==================" + 10000000 + "======================");
watchCostTime(10000000L, positionTypeEnum, prefix);
}
}
private static void watchCostTime(Long quantities, PositionTypeEnum positionTypeEnum, Object prefix) {
StopWatch watch = new StopWatch(String.format("数据量为:[%d]的ArrayList与LinkedList%s的耗时分析", quantities, positionTypeEnum.msg));
watch.start("ArrayList");
List<Object> intList = new ArrayList<>();
addData(intList, quantities, positionTypeEnum, prefix);
watch.stop();
watch.start("LinkedList");
List<Object> linkedList = new LinkedList<>();
addData(linkedList, quantities, positionTypeEnum, prefix);
watch.stop();
System.out.println(watch.prettyPrint(TimeUnit.MILLISECONDS));
}
private static void addData(List<Object> list, Long quantities, PositionTypeEnum positionTypeEnum, Object prefix) {
switch (positionTypeEnum) {
case HEAD_TYPE:
for (int i = 0; i < quantities; i++) {
list.add(0, prefix.toString() + i);
}
break;
case MIDDLE_TYPE:
for (int i = 0; i < quantities; i++) {
list.add(list.size() >>> 1, prefix.toString() + i);
}
break;
case TAIL_TYPE:
for (int i = 0; i < quantities; i++) {
list.add(prefix.toString() + i);
}
break;
default:
break;
}
}
@AllArgsConstructor
@Getter
enum PositionTypeEnum {
HEAD_TYPE("头部插入"),
MIDDLE_TYPE("中间插入"),
TAIL_TYPE("尾部插入"),
;
private final String msg;
}
}