总结平时常用的Collection子接口:List接口以及其实现类。
类图如下:
List接口,它是一个有序的collection容器(也被叫做序列)。List允许存入空元素,也允许存入重复的元复(这和另一个接口Set不同)。List常用的实现类有ArrayList, LinkedList以及Vector。
1、Vector
它是最古老的实现(since JDK1.0),但并不是很常用,原因是因为它是线程安全的,这意味着所有方法都加锁,效率不高。
2、ArrayList和LinkedList
List另外两个实现类是ArrayList和LinkedList。
a. 两个类的实现不一样,ArrayList是动态数组,所以它的长度是动态增加的。而LinkedList是双向链表的一个实现。两个类主要的区别在于对于元素操作的时间复杂度不一样:
| ArrayList<E> | LinkedList<E> |
get(int index) | O(1) <---优势 | O(n) |
add(E element) | O(1) amortized。但是最坏结果是O(n),原因是array数组需要重新计算长度 | O(1) |
add(int index, E element) | O(n - index) amortized但是最坏结果是O(n),原因同上 | O(n)。步骤:a.需要先找到元素的位置O(n),b.插入元素O(1) |
remove(int index) | O(n - index)。例如:删除最后一个元素O(1) | O(n)。步骤:a.需要先找到元素的位置O(n),b.删除元素O(1) |
Iterator.remove() | O(n - index) | O(1) <--- 优势 |
ListIterator.add(E element) | O(n - index) | O(1) <---优势 |
注:amortized:平摊代价,即每个操作的平均代价。
综上:
ArrayList对于元素的读取效率很高,
因为ArrayList允许随机的按索引(index)读取元素。(同Array特点)。但对于插入、删除的效率不高,原因是需要重新计算长度。
LinkedList对于
元素的插入、删除效率比较高(双向链表的特点),但取特定的元素比较慢。
以下是来自programcreek.com 的效率对比:
因为ArrayList的高效率,总的来说平时我们都选用ArrayList。
b. 另外,ArrayList和LinkedList都是线程不安全的,如果想要得到一个线程安全的对象,可以使用Collections类的synchronizedList方法返回线程安全的对象:
List list = Collections.synchronizedList(new ArrayList(...));
//或
List list = Collections.synchronizedList(new LinkedList(...));
c. List排序
可以使用工具类java.util.Collections提供的方法:
public static <T> void sort(List<T> list, Comparator<? super T> c)
public void sortTest() {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("ccc");
list.add("bbb");
System.out.println(list); // [aaa, ccc, bbb]
// 倒序排列
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String arg0, String arg1) {
return -arg0.compareTo(arg1);
}
});
System.out.println(list); // [ccc, bbb, aaa]
}
-------------------------------------------
参考:
http://docs.oracle.com/javase/6/docs/api/java/util/List.html
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)
http://www.programcreek.com
http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist
分享到:
相关推荐
ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 Vector 都是采用数组方式存储数据的,这种...
在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...
List接口的实现类主要有ArrayList、LinkedList和Vector。 2. **ArrayList** - **实现原理**:ArrayList基于动态数组实现,它提供快速的按索引访问,因为数组支持直接通过索引获取元素。 - **添加和删除**:对于在...
今天,我们将深入了解 Java 中的集合类别,包括 ArrayList、Vector、LinkedList 和 Map 等。 ArrayList ArrayList 是一种基于数组的集合类别,它可以存储大量的数据。ArrayList 的特点是:它可以动态地增加或减少...
java8 源码 List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -> AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的...
在 Java 集合框架中,ArrayList、Vector、LinkedList 是三个常用的 List 实现类,虽然它们都实现了 List 接口,但是它们在继承关系、实现接口、底层数据结构、扩容机制等方面存在着一些区别。 首先,从继承关系来看...
总结来说,选择哪种容器取决于具体的需求:如果需要有序的元素集合,可以使用List,如ArrayList或LinkedList;如果需要键值对存储,可以选择Map,如HashMap或HashTable;在多线程环境下,需考虑同步性能,可以选择...
在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...
Java容器类List、ArrayList、Vector及map、HashTable应用 List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的...
在Java集合框架中,Vector、ArrayList和LinkedList是三种常见的List接口实现类,它们各自具有不同的特点和适用场景。下面我们将详细对比这三个类的区别。 1. **Vector** - **线程安全**:Vector是线程安全的,因为...
List是Java集合框架中的一种接口,实现了List接口的类有多种,包括ArrayList、LinkedList、Vector等。ArrayList是一种基于数组的List实现,LinkedList是一种基于链表的List实现,而Vector是一种线程安全的List实现。...
4. Java集合框架:包括ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、PriorityQueue等集合类。 Java集合框架提供了一些常用的集合类,可以用来存储和管理数据。这些集合类可以分为两种:List和...
具体实现类方面,ArrayList和LinkedList是List接口的两种常用实现。ArrayList类似于动态数组,提供高效的随机访问和插入操作,适合频繁查找和访问的情况;而LinkedList则基于链表实现,插入和删除操作更高效。 对于...
《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm
2. List(列表):有序、可重复、多个null元素,实现类有ArrayList、LinkedList、Vector等。 3. Map(映射):键值对集合,键无序、唯一,值可重复,实现类有HashMap、TreeMap、HashTable等。 集合框架的优点: 1....
ArrayList、Vector和LinkedList都是List接口的实现类,它们各自具有不同的特性和使用场景。 1. ArrayList: ArrayList基于动态数组实现,提供快速的随机访问。在向ArrayList添加元素时,如果现有容量不足,会进行...
### Vector vs ArrayList #### 区别 - **线程安全性**:`Vector` 是线程安全的,而 `ArrayList` 不是。`Vector` 中的大部分方法都是同步的,可以在不加额外同步措施的情况下用于多线程环境。 - **性能**:由于 `...
在Java集合框架中,Vector、ArrayList和LinkedList都是List接口的实现,它们提供了有序集合的功能,允许根据位置进行元素的添加、删除和查找。然而,它们在设计和性能上有着显著的区别。 首先,Vector是Java早期...