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适合插入和删除频烦,但查询较少
总结
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
- List ArrayList LinkedList 初探
- list arraylist 和 linkedlist
- java List LinkedList ArrayList
- List(ArrayList与LinkedList)
- java??List?LinkedList?ArrayList ??
- List ArrayList LinkedList
- java、List、ArrayList、LinkedList
- 集合list、ArrayList、LinkedList、Vector
- Collection-List/ArrayList/LinkedList/Vector
- List的ArrayList和LinkedList
- Collection框架(Collection,List,ArrayList,LinkedList,Vector)
- List 和 LinkedList/ArrayList 声明的区别
- List ArrayList LinkedList
- List集合:Vector ArrayList LinkedList异同
- java中的list,arraylist,vector,linkedlist
- 黑马程序员-List-ListIterator-LinkedList-ArrayList
- List接口下 Arraylist Linkedlist Vector区别
- Collection之List Vector ArrayList and linkedList
- Difference between printf, print, and sprintf in Perl?
- PS 开启GPU加速图片处理
- 【LeetCode-442】Find All Duplicates in an Array(C++)(
- Windows服务程序的调试
- 欢迎使用CSDN-markdown编辑器
- List ArrayList LinkedList 初探
- java实现导出Excel(跨行,跨列)
- AngularJS 核心特性
- 整点刷新
- Gradle常用配置
- 第十一章:持有对象(下)
- 学生选课-集合案例
- 常用颜色
- WAMP3.0允许局域网访问