ArrayList和LinkedList插入效率对比
JVM配置, 防止发生GC
ArrayList
public void myArrayListAdd() {
List list = new ArrayList<>();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println("array插入效率" + (endTime - startTime));
}
打印
LinkedList
public void myLinkedListAdd() {
LinkedList list = new LinkedList<>();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
list.addFirst(i);
}
long endTime = System.currentTimeMillis();
System.out.println("link插入效率" + (endTime - startTime));
}
打印
结论
在JVM不进行GC的情况下, 5kw的测试数据量插入, ArrayList效率比LinkedList要快一些
插入为什么会慢的原因
ArrayList在数组容量不够的情况下, 会复制数据, 导致效率下降
LinkedList在插入的时候, 会创建节点Note对象, 创建对象的开销是非常大的
优化
ArrayList可以在初始化的时候设置大小, 减少复制带来的性能消耗
public void myArrayListAdd() {
List list = new ArrayList<>(50000000);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println("array插入效率" + (endTime - startTime));
}
打印
为什么ArrayList的属性elementData需要transient修饰符
ArrayList在容量不够的时候, 是需要扩容的, 这时候数组里面就会有大量的空元素, 这些空元素是不需要序列化的, 所以会有transient修饰符
为什么HashSet的Value不能为NULL
HashSet的底层使用的HashMap
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
在添加数据的时候, 如果Value为null, map.put()方法, 无法判断之前是否已经有该Key存在