ArrayList、LinkedList、Vector都实现了List接口,它们有什么区别呢?
ArrayList低层是数组来实现的,所以它适合查找和修改,不适合删除和增加。
LinkedList低层是双向链表来实现的,所以它适合删除和增加,不适合查找和修改。
Vector跟ArrayList相似,低层都是数组,它们唯一的区别就是vector是线程安全的,ArrayList是非线程安全的,所以Vector在使用起来,vector效率要底一些。为什么线程安全就效率底一些呢,因为在设计这个容器的时候,为了保证数据不能同时被两个线程访问,也就是为了保护数据不出错,所以访问容器里面的数据会有一个加锁和释放锁的过程,Vector内部就是通过在方法体上加Synchronize关键字来到达这效果。这就导致了这个容器的存储各方面效率相对较低,这也是经常使用ArrayList而很少Vector原因,跟们它们相似的还有HashMap和HashTable、StringBuffer和StringBuilder,因为同样的原因,HashMap和StringBuilder使用的比较多。
下面是一段模拟JDK中LinkedList的一个容器
class MyLinkedList<T>{
int size=0;
Node<T> first;//定义指向第一个节点的指针
Node<T> last;//等译指向最后一个节点的指针
public void add(T data){
final Node<T> l = last;//定义一个临时的引用把最后一个节点保存起来
final Node<T> newNode = new Node<T>(data, null);//新建节点
last = newNode;
if (l == null)//如果l为空,说明之前还没添加过节点
first = newNode;//为初始节点赋值
else //如果l不为空,则说明之前已经添加过节点了,
l.next = newNode;//
size++;
}
public T get(int index){
Node<T> n=this.first;//定义一个临时的引用保存第一个节点
for(int k=1;k<=index;k++,n=n.next);
return n.data;
}
}
class Node<T>{
T data;
Node next;
public Node(T data,Node<T> next){
this.data=data;
this.next=next;
}
}
只模拟了添加和查找函数,对于修改和删除思想应该差不多,这里的add函数,刚开始,我没写出来,因为感觉里面都是各种引用,指过来指过去最后把数据都指没了,后来参考jdk的源码,才搞明白,下面是我对add函数的理解以及图示: