List ArrayList LinkedList 初探

来源:互联网 发布:openstack的网络配置 编辑:程序博客网 时间:2024/06/05 15:48

集合是我么开发中经常使用的,常使用的有List ArrayList LinkedList,他们的应用场景及原理性能到底是如何呢,本篇将从以下几点讲解

  • 实现及原理
  • 应用场景及优缺点分析
  • 总结

一.实现及原理

1.1 List

List 是一个接口,它继承于Collection的接口。List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

public interface List<E> extends Collection<E> {...}

1.2 ArrarList

ListArray是一个类,继承并实现了List接口,ArrayList实现了可变大小的数组,它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

public class ArrayList<E> extends AbstractList<E> implements Cloneable, Serializable, RandomAccess {...}public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {...}

1.3 LinkedList

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));

public class LinkedList<E> extend AbstractSequentialList<E> implements List<E>, Deque<E>, Queue<E>, Cloneable, Serializable {...}public abstract class AbstractSequentialList<E> extends AbstractList<E> {...}public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {...}

二 . 应用场景及优缺点分析

2.1.ArrayList

ArrayList它由数组实现,随机访问效率高,随机插入、随机删除效率低,因为要移动数据填补被删对象空间,插入也是同样的。
适合随机查询频繁但是删除和插入较少

2.2.LinkedList

LinkedList是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。数据都会存放在独立的空间中,LinkedList随机访问效率低,但随机插入、随机删除效率高。链表的查询效率较低,因为链表查询要从链表头开始查询,通过指针一个一个查询直到查找到相应数据为止,所以效率较低,然而链表的插入和删除效率较高,当删除一个链表中的数据时,会直接删除该数据,同时修改上一个数据链表数据直接指向下一条数据。
LinkedList 图解
所以,LinkedList适合插入和删除频烦,但查询较少

总结

ArrayList和LinkedList都不是线程安全的,线程安全问题是由多个线程同时写或同时读写同一个资源造成的,可通过源码分析。也可以使用Collections.synchronizedList。同样实现List接口的Vector是同步的,因为他的主要方法实现了synchronized同步锁。具体要看自身的使用情况。

参考资料

  • http://www.cnblogs.com/janneystory/p/5758958.html
  • http://blog.csdn.net/wangzff/article/details/7296648
  • http://blog.csdn.net/duanyipeng/article/details/7851110
0 0