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

总结平时常用的Collection子接口:List接口以及其实现类。

类图如下:
[img]http://dl.iteye.com/upload/picture/pic/135137/a92eb773-19ff-345f-9bb8-e6db20829123.png[/img]

[b]List接口,它是一个有序的collection容器(也被叫做序列)。List允许存入空元素,也允许存入重复的元复(这和另一个接口Set不同)。List常用的实现类有ArrayList, LinkedList以及Vector。[/b]

[b]1、Vector[/b]
它是最古老的实现(since JDK1.0),但并不是很常用,原因是因为它是线程安全的,这意味着所有方法都加锁,效率不高。

[b]2、ArrayList和LinkedList[/b]
List另外两个实现类是ArrayList和LinkedList。
a. 两个类的实现不一样,ArrayList是动态数组,所以它的长度是动态增加的。而LinkedList是双向链表的一个实现。两个类主要的区别在于对于元素操作的时间复杂度不一样:
[table]
| |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) <---优势|
[/table]
注:amortized:平摊代价,即每个操作的平均代价。

[b]综上:[/b]
ArrayList对于元素的读取效率很高,[b]因为ArrayList允许随机的按索引(index)读取元素[/b]。(同Array特点)。但对于插入、删除的效率不高,原因是需要重新计算长度。
LinkedList对于[b]元素的插入、删除效率比较高(双向链表的特点)[/b],但取特定的元素比较慢。

[b]以下是来自programcreek.com 的效率对比:[/b]
[img]http://dl.iteye.com/upload/picture/pic/135139/c158a97e-d6a0-3a73-ab2f-2fddc5414a0d.png[/img]

[b]因为ArrayList的高效率,总的来说平时我们都选用ArrayList。[/b]

[b]b. 另外,ArrayList和LinkedList都是线程不安全的[/b],如果想要得到一个线程安全的对象,可以使用Collections类的synchronizedList方法返回线程安全的对象:

List list = Collections.synchronizedList(new ArrayList(...));
//或
List list = Collections.synchronizedList(new LinkedList(...));


[b]c. List排序[/b]
可以使用工具类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]
}



-------------------------------------------
参考:
[url]http://docs.oracle.com/javase/6/docs/api/java/util/List.html[/url]
[url]http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)[/url]
[url]http://www.programcreek.com[/url]
[url]http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值