1.ArrayList
Arraylist的底层是数组
ArrayList 底层是基于数组来实现容量大小动态变化的。
/**
* The size of the ArrayList (the number of elements it contains).
*/
private int size; // 实际元素个数
transient Object[] elementData;
所以ArrayList因为有下标的缘故用get方法查找就很快
2.LinkedList
LinkedList的底层是双向链表
// 双向链表的节点所对应的数据结构。
// 包含3部分:上一节点,下一节点,当前节点值。
private static class Entry<E> {
// 当前节点所包含的值
E element;
// 下一个节点
Entry<E> next;
// 上一个节点
Entry<E> previous;
/**
* 链表节点的构造函数。
* 参数说明:
* element —— 节点所包含的数据
* next —— 下一个节点
* previous —— 上一个节点
*/
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
当需要在首位置插入元素时,first 引用指向需要插入到链表中的节点对象,新的节点对象的next引用指向原先的首节点对象;
所以,对于LinkedList,它在插入、删除集合中任何位置的元素所花费的时间都是一样的,但是它根据索引查询一个元素的时候却比较慢。
总结
ArrayList
ArrayList在寻址读取数据比较容易,插入和删除比较困难。而LinkedList需要移动指针
LinkedList
对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
在遍历ArrayList和LinkedList时,ArrayList用get方法效率更高,优于迭代器和foreach遍历,Linkedlist则相反,且在数量级大时效率差异极大。
参考文章
https://blog.csdn.net/lydong_/article/details/48939989