谈谈Vector/ArrayList/LinkedList
虽然Vector,ArrayList,LinkedList均为线型的数据结构,但是从实现方式和应用场景来看又存在差别.
1.ArrayList,LinkedList为非线程安全;Vector是基于synchronized实现的线程安全的ArrayList.Vector因为同步会有性能损耗,即使在多线程环境下,Collections这个类中的synchronizedList(List list)方法返回一个线程安全的同步列表对象。
2.ArrayList对元素的增加和删除都会引起数组的内存分配空间的动态变化。因此,对其进入add和remove速度比较慢,但是检索的时候速度很快.
LinkedList由于基于链表方式存放数据,add和remoce的速度较快,但是检索速度较慢。
3.ArrayList当插入的元素超过当前数组预定义的最大值时,数组需要进行扩容,扩容过程需要调用底层System.arraycopy()进行大量的数组复制操作;在删除元素时并不会减少数组的容量,当然如果需要缩小数组容量,可以调用trimToSize()方法;在查找元素时要遍历数组,对于非null的元素采用equals()寻找.
LinkedList在插入元素时,必须创建一个新的Entry对象,并更新相应元素的前后元素的引用;在查找元素时,需遍历链表;在删除元素时,要需要遍历链表.找到要删除的元素,然后从链表上将此元素删除.
Vector与ArrayList仅在插入元素时容量扩充机制不同.对于Vector,默认创建一个大小为10的Object数组,并将capacityIncrement设置为0;当插入元素数组大小不够时,如果capacityIncrement大于0,则将Object数组的大小扩大为size+capacityIncrement;如果capacityIncrement小于等于0,则将Object数组的大小扩大为现有大小的2倍.
4.ArrayList内部用数组来实现;LinkedList内部采用双链表实现;Vector内部用数组实现.