[面试题] Java中ArrayList和LinkedList什么区别
直接开背:
ArrayList和LinkedList都实现了List接口,
ArrayList是基于索引的数据接口,它的底层是采用的数组实现,以O(1)的时间复杂度对元素进行随机访问。
LinkedList是基于双向链表的形式存储数据,每个元素和他的前后元素链接在一起,以O(n)的时间复杂度进行查找。
相比于ArrayList来讲,LinkedList的插入,删除操作更快,因为当元素背添加到集合任意位置的时候,不需要像数组那样重新计算大小或大批量数据移动。
而LinkedList相比于ArrayList来讲,ArrayList内存占用更小,查询速度更快。LinkedList每一个节点存储了两个引用,分别指向前一个和后一个元素。
如果面试官问你什么场景下用ArrayList和LinkedList
当应用不会发生随机访问数据时,或者经常需要插入或者删除中间数据的时候,采用LinkedList
当应用很少发生中间数据的插入删除,而查找相对更多时,采用ArrayList.
(ps: 说句不好听的,在写业务代码的时候基本上就没考虑过用LinkedList😂)
属性原理
ArrayList
通过对ArrayList源码分析
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 默认容量空元素数据
transient Object[] elementData; // non-private to simplify nested class access
private int size;
...
}
其主要属性就是如下:
DEFAULT_CAPACITY: 默认初始化容量:10
EMPTY_ELEMENTDATA:用于空实例的共享数组实例,也就是用于在判断内部数据是否是空 或者 将数据清空的时候使用
DEFAULTCAPACITY_EMPTY_ELEMENTDATA:用于默认大小的空实例的共享数组实例。即,new ArrayList时不传入任何参数时,默认创建出来的容量为10的数组。或者当出现容量计算时,使用此数组
elementData:ArrayList中的缓存数组,也可以认为是你ArrayList中的那个根本数组。
size: 数组大小,方便运算的
LinkedList
对LinkedList属性源码分析:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
...
}
属性如下:
size:List大小,直接可以取值而无需重新计算
first:头节点
last:尾节点
每个Node如下:
private static class Node<E> {
E item;
Node<E> next; // 前驱节点
Node<E> prev; // 后置节点
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
至此说明:
评论区 催更其他面试题。谢谢~~🙏