Java基础L
List整个系列的类关系图
通过类关系图可以知道Collection继承了Iterator,从而List和Set都可以使用迭代器进行遍历。
List接口规定了List的一些基础的方法。
ArrayList
实现原理
ArrayList内部实现是数组,默认初始化大小是10,在扩容时以原来的二分之一进行,int newCapacity = oldCapacity + (oldCapacity >> 1);
ArrayList可以支持下标进行访问,但无法类似于数组那样直接通过下标访问。
须通过set,get方法进行下标访问。使用下标访问要比使用迭代器访问效率高。
//数组
array[0] = 1;
int a = array[0]
// ArrayList
arrayList.set(0,1);
arrayList.get(0);
优点
ArrayList实现了RandomAccess,可以随机快速访问元素。适用于查找。
LinkedList
实现原理
内部通过链表实现,对于频繁插入删除操作是非常适合的。LinkedList不支持随机访问,但它依然提供类似于ArrayList的get(index)
方法,这个方法的实现是通过index进行for循环遍历。
以下是LinkedList内部get方法的源码,通过保存头尾节点的指针进行遍历。
Node<E> node(int index) {
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
在遍历时,可以使用for-each或者迭代器进行遍历,性能都要优于上面的get(index)
。
优点
对于插入删除操作效率要尤于ArrayList。
Vector
实现原理
与ArrayList一样,内部都是数组实现。在进行动态扩容方面,ArrayList是增长自身的50%,而Vector是进行自身翻倍,其余跟ArrayList无太大区别。
各个方法都加了synchronized
关键字进行同步,是线程安全的一个类,进行同步也意味着性能下降。
优点
线程同步
总结
List接口规定最基础的方法,子类进行个性化实现。
ArrayList适合用于多查找的场景。
LinkedList适合用于多插入多删除的场景。
Vector是线程安全类,适合用于多线程访问的场景。