Java多个数据集合类的使用细节点总结
程序员文章站
2022-06-27 20:32:14
JVM配置, 防止发生GCArrayListpublic void myArrayListAdd() { List list = new ArrayList<>(); long startTime = System.currentTimeMillis(); for (int i = 0; i < 50000000; i++) { list.add(i); } long endTime = System.currentTimeMi...
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存在
本文地址:https://blog.csdn.net/xushijie89/article/details/108036800
上一篇: Vue.js 样式绑定
下一篇: 分布式架构演进(个人学习用)