他们都实现了 List 接口 都不是线程同步的.
ArrayList:无参构造方法
public ArrayList() {
this(10); //初始大小为10
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
LinkedList 无参构造方法
private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;
/**
* Constructs an empty list.
*/
public LinkedList() {
header.next = header.previous = header;
}
添加上的区别
ArrayList. add方法
public boolean add(E e) {
ensureCapacity(size + 1); // 确保数组有足够的空间
elementData[size++] = e; //将对象添加到末尾.
return true;
}
在看下
ensureCapacity 方法
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) { //如果数组容量不够 则进行扩容
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; //扩容到原来空间的1.5倍
if (newCapacity < minCapacity) //如果新空间小于最小的空间容量
newCapacity = minCapacity; //则使用最小空间容量
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity); //进行扩容的数组复制
}
}
LinkedList add方法
public boolean add(E e) {
addBefore(e, header);
return true;
}
private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
LinkedList add 将对象添加到herart之前
LinkedList使用了链表结构.因此不需要维护空间的大小. 但是如果频繁的调用会对系统性能上产生一定影响
和ArrayList相比 在add操作的时候 不如add的效率高.
但是在指定插入位置时候 效率LinkedList明显会高于ArrayList
删除任意对象 LinkedList也明显高于ArrayList
在使用 forecah迭代操作时候 两者速度相同
使用传统 for循环 则ArrayList占据优势
对于数组实现ArrayList来说 随机访问(传统for循环)是很快的. 但是LinkedList是基于链表实现的 使用随机访问效果会很差.