ArrayList,LinkedList使用场景及性能说明
来源:互联网 发布:模拟软件下载 编辑:程序博客网 时间:2024/05/21 08:53
大部分只能了解其大概使用方法,对其内部结构缺乏了解,错误的使用方式会导致性能大幅下降。
首先介绍ArrayList,顾名思义内部数据结构是数组
在增加元素时,若容量不足进行扩充
新数组大小为之前数组大小*1.5+1 ,加上1保证oldCapacity为1的情况也能扩充为2
(类似分页时总页数=(总记录数+ (每页记录数-1))/每页记录数算法)
删除元素时通过 System.arraycopy把删除位置后的所有元素前移一个位置实现
LinkedList大家都知道是通过链表实现,内部是一个双向链表
插入和删除都只要改动前后节点的next和previous实现
总结特点如下:
类型内部结构顺序遍历速度随机遍历速度追加代价插入代价删除代价占用内存ArrayList数组高高中高高低LinkedList双向链表高低低低低中
所以:
首先介绍ArrayList,顾名思义内部数据结构是数组
private transient Object[] elementData; private int size; public ArrayList(int initialCapacity){ }
在增加元素时,若容量不足进行扩充
public void ensureCapacity(int minCapacity) {modCount++;int oldCapacity = elementData.length;if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity)newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity);} }
新数组大小为之前数组大小*1.5+1 ,加上1保证oldCapacity为1的情况也能扩充为2
(类似分页时总页数=(总记录数+ (每页记录数-1))/每页记录数算法)
删除元素时通过 System.arraycopy把删除位置后的所有元素前移一个位置实现
public E remove(int index) {RangeCheck(index);modCount++;E oldValue = (E) elementData[index];int numMoved = size - index - 1;if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved);elementData[--size] = null; // Let gc do its workreturn oldValue; }
LinkedList大家都知道是通过链表实现,内部是一个双向链表
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ private transient Entry<E> header = new Entry<E>(null, null, null); private transient int size = 0;}private static class Entry<E> {E element;Entry<E> next;Entry<E> previous;}
插入和删除都只要改动前后节点的next和previous实现
总结特点如下:
类型内部结构顺序遍历速度随机遍历速度追加代价插入代价删除代价占用内存ArrayList数组高高中高高低LinkedList双向链表高低低低低中
所以:
- 一般顺序遍历情况下使用ArrayList,但注意构造函数中设置初始大小
- 尽量不对ArrayList进行插入或删除操作(删除尾部除外),若有多次删除/插入操作又有随机遍历的需求,可以再构建一个ArrayList,把复合条件的对象放入新ArrayList,而不要频繁操作原ArrayList
- 经常有删除/插入操作而顺序遍历列表的情况下最适合使用LinkedList
0 0
- ArrayList,LinkedList使用场景及性能说明
- ArrayList和LinkedList区别及使用场景
- LinkedList, ArrayList等使用场景和性能分析)
- JAVA LinkedList和ArrayList的使用及性能分析
- Java ArrayList、LinkedList和Vector的使用及性能分析
- JAVA LinkedList和ArrayList的使用及性能分析
- JAVA LinkedList和ArrayList的使用及性能分析
- JAVA中LinkedList和ArrayList的使用及性能分析
- java LinkedList和ArrayList使用测试 场景
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java 集合系列之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- java集合--List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
- Java【集合系列】-08-List总结(LinkedList, ArrayList等使用场景和性能分析)
- 什么场景下更适宜使用LinkedList,而不用ArrayList。
- git学习心得(一)——如何关联本地库和远程
- 秒杀多线程系列
- maven fastdfs_client.jar找不到问题解决
- Nginx关于连接超时配置的实验
- BZOJ 4569 [Scoi2016]萌萌哒
- ArrayList,LinkedList使用场景及性能说明
- html 文字乱码 (日本語 文字化け)
- 中断与异常的区别
- CDQZ 高新2016级ACM模拟赛No.001考后总结
- Java的参数传递有值传递和引用传递
- eclipse gradle buildship 执行build任务提示Could not find tools.jar
- Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例
- 剑指offer-二维数组中的查找
- 在O(1)时间删除单链表结点