android的ArrayList和LinkedList的应用场景和源码分析
简介
ArrayList和LinkedList都是AbstractList的子类,都实现了List接口。而且都是日常开发中最常用的List。但是实话实说,在之前的很长一段时间的开发里,我涉及到list都是用arraylist去实现的。以至于在很长一段时间里,我完全不知道LinkedList的存在,以为list只有ArrayList这一个实现方法。
但是实际上,一切list都用arraylist是非常不合理的,虽然可以满足需求,但是在部分情况下,会非常影响性能。所以我们需要明白在什么场景下,应该用什么样的实现类。所以也就有了这篇文章,我们从原理上分析,ArrayList和LinkedList的异同。
结论
原谅我,还没有看源码就下结论了。但是对于很多小伙伴们来说,其实知道结论就够了。所以我就暂且把结论放在最前面了。
ArrayList: 底层由数组提供支持。有非常好的随机读写能力,但是对于在数组中间插入和移除数据较慢。
LinkedList: 底层由链表提供支持。对于列表中间移除和插入数据速度非常快,并且不存在扩容问题。但是随机读写能力较弱。
源码分析
构造函数
ArrayList
transient Object[] array;
/**
* Constructs a new {@code ArrayList} instance with zero initial capacity.
*/
public ArrayList() {
//无参构造函数,新建一个空数组
array = EmptyArray.OBJECT;
}
LinkedList
//transient 修饰的变量不参与序列化
transient Link<E> voidLink;
private static final class Link<ET> {
ET data; //保存的数据
//previous指向上一个数据,next指向下一个数据。双向链表的必备
Link<ET> previous, next;
Link(ET o, Link<ET> p, Link<ET> n) {
data = o;
previous = p;
next = n;
}
}
public LinkedList() {
//构建一个空的链表,这里的voidLink 上一个指向自己,下一个也指向自己
voidLink = new Link<E>(null, null, null);
voidLink.previous = voidLink;
voidLink.next = voidLink;
}
add方法
ArrayList
/**
* Adds the specified object at the end of this {@code ArrayList}.
*
* @param object
* the object to add.
* @return always true
*/
@Override public boolean add(E object) {
Object[] a = array;
int s = size; //当前L