ArrayList、LinkedList、Vector的使用和优化。

来源:互联网 发布:英虎网络股份有限公司 编辑:程序博客网 时间:2024/05/16 12:41
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函数的理解以及图示:



0 0