一、ArrayList的实现
1、ArrayList实现了List接口,继承了AbstractList抽象类,底层是基于动态数组实现的;
2、ArrayList还实现了RandomAccess接口,这是一个标记接口,内部是空的,表示ArrayList支持快速随机访问(不需要遍历,通过索引直接访问内存地址);
3、ArrayList还实现了Cloneable接口,表示ArrayList支持拷贝;
4、ArrayList还实现了Serializable接口,这是一个标记接口,内部是空的,表示ArrayList支持序列化;
5、ArrayList实现了动态扩容。
//部分源码
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;
private int size;
//实现了动态扩容
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
}
}
//get方法
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
//set方法
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
}
二、LinkedList的实现
1、LinkedList是一个继承自AbstractSequentialList的双向链表,因此他也可以被当作堆栈、队列或双端队列进行操作;
2、LinkedList内部定义了一个Node节点,它包含3个部分:元素内容item,前引用prev和后引用next;
3、LinkedList也实现了Cloneable接口,这表明LinkedList也支持拷贝;
4、LinkedList也实现了Serializable接口,这表明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;
}
三、ArrayList和LinkedList的区别
ArrayList | LinkedList | |
---|---|---|
数据结构 | 基于动态数组 | 基于双向链表 |
性能 | 更适合随机查找 | 更适合添加和删除 |
线程安全 | 非线程安全 | 线程安全 |
内存占用 | 相对较少 | 相对较多 |
迭代性能 | 对于顺序迭代非常高效 | 对于随机访问性能较差 |