`
angelbill3
  • 浏览: 256941 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

【总结】Java基础之List:ArrayList vs. LinkedList vs. Vector

 
阅读更多
总结平时常用的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区别

    ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 Vector 都是采用数组方式存储数据的,这种...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    比较ArrayList、LinkedList、Vector1

    List接口的实现类主要有ArrayList、LinkedList和Vector。 2. **ArrayList** - **实现原理**:ArrayList基于动态数组实现,它提供快速的按索引访问,因为数组支持直接通过索引获取元素。 - **添加和删除**:对于在...

    Java 各种集合的区别ArrayList Vector LinkedList map区别

    今天,我们将深入了解 Java 中的集合类别,包括 ArrayList、Vector、LinkedList 和 Map 等。 ArrayList ArrayList 是一种基于数组的集合类别,它可以存储大量的数据。ArrayList 的特点是:它可以动态地增加或减少...

    java8源码-csn-list:ArrayList、LinkedList、Vector、Stack源码分析

    java8 源码 List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -&gt; AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的...

    ArrayList、Vector、LinkedList 的区别.docx

    在 Java 集合框架中,ArrayList、Vector、LinkedList 是三个常用的 List 实现类,虽然它们都实现了 List 接口,但是它们在继承关系、实现接口、底层数据结构、扩容机制等方面存在着一些区别。 首先,从继承关系来看...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    总结来说,选择哪种容器取决于具体的需求:如果需要有序的元素集合,可以使用List,如ArrayList或LinkedList;如果需要键值对存储,可以选择Map,如HashMap或HashTable;在多线程环境下,需考虑同步性能,可以选择...

    JDK1.6中Arraylist,Vector,LinkedList源码

    在Java编程语言中,ArrayList、Vector和LinkedList是三种常见的动态数组实现,它们都属于集合框架中的List接口。这里我们将深入探讨这三种数据结构的源码,理解它们的内部实现、性能特性和适用场景。 首先,...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    Java容器类List、ArrayList、Vector及map、HashTable应用 List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的...

    对比Vector、ArrayList、LinkedList1

    在Java集合框架中,Vector、ArrayList和LinkedList是三种常见的List接口实现类,它们各自具有不同的特点和适用场景。下面我们将详细对比这三个类的区别。 1. **Vector** - **线程安全**:Vector是线程安全的,因为...

    10个Java经典的List面试题!.pdf

    List是Java集合框架中的一种接口,实现了List接口的类有多种,包括ArrayList、LinkedList、Vector等。ArrayList是一种基于数组的List实现,LinkedList是一种基于链表的List实现,而Vector是一种线程安全的List实现。...

    Java基础核心总结.pdf

    4. Java集合框架:包括ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、PriorityQueue等集合类。 Java集合框架提供了一些常用的集合类,可以用来存储和管理数据。这些集合类可以分为两种:List和...

    9、JavaSE:集合框架.pdf

    具体实现类方面,ArrayList和LinkedList是List接口的两种常用实现。ArrayList类似于动态数组,提供高效的随机访问和插入操作,适合频繁查找和访问的情况;而LinkedList则基于链表实现,插入和删除操作更高效。 对于...

    《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm

    《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm

    Java 72 道面试题及答案.docx

    2. List(列表):有序、可重复、多个null元素,实现类有ArrayList、LinkedList、Vector等。 3. Map(映射):键值对集合,键无序、唯一,值可重复,实现类有HashMap、TreeMap、HashTable等。 集合框架的优点: 1....

    javalist数据结构-Java数据结构-------List.pdf

    ArrayList、Vector和LinkedList都是List接口的实现类,它们各自具有不同的特性和使用场景。 1. ArrayList: ArrayList基于动态数组实现,提供快速的随机访问。在向ArrayList添加元素时,如果现有容量不足,会进行...

    51. ArrayList LinkedList Set HashMap介绍.txt

    ### Vector vs ArrayList #### 区别 - **线程安全性**:`Vector` 是线程安全的,而 `ArrayList` 不是。`Vector` 中的大部分方法都是同步的,可以在不加额外同步措施的情况下用于多线程环境。 - **性能**:由于 `...

    第8讲 对比Vector、ArrayList、LinkedList有何区别1

    在Java集合框架中,Vector、ArrayList和LinkedList都是List接口的实现,它们提供了有序集合的功能,允许根据位置进行元素的添加、删除和查找。然而,它们在设计和性能上有着显著的区别。 首先,Vector是Java早期...

Global site tag (gtag.js) - Google Analytics