在使用
java的時候,我們都會遇到使用集合(collection)的時候,但是
java api提供了多種集合的實現。
總的說來,
java api中所用的集合類,都是實現了collection接口,他的一個類繼承結構如下:
collection<--list<--vector
collection<--list<--arraylist
collection<--list<--linkedlist
collection<--set<--hashset
collection<--set<--hashset<--linkedhashset
collection<--set<--sortedset<--treeset
vector : 基于array的list,其實就是封裝了array所不具備的一些功能方便我們使用,它不可能走入array的限制。性能也就不可能超越array。所以,在可能的情況下,我們要多運用array。另外很重要的一點就是vector“sychronized”的,這個也是vector和arraylist的唯一的區別。
arraylist:同vector一樣是一個基于array上的鏈表,但是不同的是arraylist不是同步的。所以在性能上要比vector優越一些,但是當運行到多
線程環境中時,可需要自己在管理
線程的同步問題。
linkedlist:linkedlist不同于前面兩種list,它不是基于array的,所以不受array性能的限制。它每一個節點(node)都包含兩方面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextnode)。所以當對linkedlist做添加,刪除動作的時候就不用像基于array的list一樣,必須進行大量的數據移動。只要更改nextnode的相關信息就可以實現了。這就是linkedlist的優勢。
list總結:
1. 所有的list中只能容納單個不同類型的對象組成的表,而不是key-value鍵值對。例如:[ tom,1,c ];
2. 所有的list中可以有相同的元素,例如vector中可以有 [ tom,koo,too,koo ];
3. 所有的list中可以有null元素,例如[ tom,null,1 ];
4. 基于array的list(vector,arraylist)適合查詢,而linkedlist(鏈表)適合添加,刪除操作。
hashset:雖然set同list都實現了collection接口,但是他們的實現方式卻大不一樣。list基本上都是以array為基礎。但是set則是在hashmap的基礎上來實現的,這個就是set和list的根本區別。hashset的存儲方式是把hashmap中的key作為set的對應存儲項。看看hashset的add(object obj)方法的實現就可以一目了然了。
public boolean add(object obj)
{
return map.put(obj, present) == null;
}
這個也是為什么在set中不能像在list中一樣有重復的項的根本原因,因為hashmap的key是不能有重復的。
linkedhashset:hashset的一個子類,一個鏈表。
treeset:sortedset的子類,它不同于hashset的根本就是treeset是有序的。它是通過sortedmap來實現的。
set總結:
1. set實現的基礎是map(hashmap);
2. set中的元素是不能重復的,如果使用add(object obj)方法添加已經存在的對象,則會覆蓋前面的對象。