本文系 www.javady.com網站原創
總接口:Iterable<T> 實現這個接口允許對象成為 "foreach" 語句的目標。
Collection<E> 層次結構 中的根接口。Collection 表示一組對象
一、 List :實現 collection接口 有序的集合 可以允許重復
ArrayList |
初始大小 |
10 |
擴容因子 |
(大小*3)/2 + 1 |
擴容例子 |
10 超過時之后擴容到 16 然后 25 然后 38... |
數據處理 |
刪除其中一個元素后后面的元素會自動向前推 |
線程是否安全 |
不安全 |
優勢 |
ArrayList的優勢在于讀取和表尾插入 |
多線程使用 |
List list = Collections.synchronizedList(new ArrayList(…)) |
LinkedList |
說明 |
List接口的鏈接列表實現 。 |
初始大小 |
1 |
數據處理 |
刪除其中一個元素后后面的元素會自動向前推,
LinkedList 中的鏈接關系是由 Entity實現的,
每個Entity都有 上一個Entity引用 下一個Entity引用
本身元素值Entry(E element, Entry<E> next, Entry<E> previous)
LinkedList 類還為在列表的開頭及結尾 get、remove 和 insert
元素提供了統一的命名方法。
此類實現 Queue 接口,為 add、poll 等提供先進先出隊列操作 |
優勢 |
LinkedList的優勢在于表中插入和刪除 |
線程是否安全 |
不安全 ,可以使用如下進行安全處理
List list = Collections.synchronizedList(new LinkedList(...)); |
Vector |
說明 |
Vector 類可以實現可增長的對象數組 |
初始大小 |
10 |
擴容因子 |
1 , 默認擴容一倍 |
擴容例子 |
10 超過時之后擴容到 20 然后 40 然后 80… |
數據處理 |
刪除其中一個元素后后面的元素會自動向前推 |
是否同步 |
Vector 是同步的 |
用法 |
一般在多線程中使用對于一般的數據存儲直接用ArrayList |
Stack |
類型解釋 |
表示后進先出(LIFO)的對象堆棧 。
它通過五個操作對類 Vector 進行了擴展 ,
允許將向量視為堆棧。
它提供了通常的 push 和 pop 操作 |
幾種方法 |
empty()
測試堆棧是否為空。
E peek()
查看棧頂對象而不移除它。
E pop()
移除棧頂對象并作為此函數的值返回該對象。
E push(E item)
把項壓入棧頂。
int search(Object o)
返回對象在棧中的位置,以 1 為基數。 |
Arrays |
說明 |
專門用來操作數組的輔助類 Array 固定個數效率最高 |
數據處理 |
Arrays中擁有一組static函數, equals(): 比較兩個array是否相等。array擁有相同元素個數,
且所有對應元素兩兩相等。 fill(): 將值填入array中。 sort(): 用來對array進行排序。 binarySearch():在排好序的array中尋找元素。 System.arraycopy():array的復制 |
優勢 |
這個就是用來處理數組的,效率特別高
如果之前對Arrays沒這么的重視,在J2SE 5.0之后,可以多關照它幾眼
。如果有數組操作方面的相關需求,可以先查查 java.util.Arrays的API文
件說明,看看有沒有現成的方法可以使用 |
二、Set :一個不包含重復元素的 collection。
HashSet |
說明 |
內部使用HashMap 來存儲數據 |
初始大小 |
16 |
擴容因子 |
數據超過當前大小*0.75 容量擴一倍 |
擴容例子 |
當前容量16 如果插入13個數 超過了(16*0.75=12)
容量增加16 最后容量是 32。 |
優勢 |
不允許有重復的元素 |
線程是否安全 |
不安全,可以使用如下進行安全處理
Set s = Collections.synchronizedSet(new HashSet(...)) |
LinkedHashSet |
說明 |
內部使用HashMap 來存儲數據 |
初始大小 |
16 |
擴容因子 |
數據超過當前大小*0.75 容量擴一倍 |
擴容例子 |
當前容量16 如果插入13個數 超過了(16*0.75=12)
容量增加16 最后容量是 32。 |
優勢 |
不允許有重復的元素 、 查詢足夠快 、 有序 |
線程是否安全 |
不安全,可以使用如下進行安全處理
Set s = Collections.synchronizedSet(new HashSet(...)) |
三、Map :一個不包含重復元素的 無序集合 鍵值對 。
HashMap |
說明 |
內部使用Entity來存儲數據,key可以為空
put方法:如果key為空,則替換換Key為空的值,
否則插入到第 O 位置上。
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
//null key都放在table[0]上
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
如果key不為空,先算出來key對象的hashcode ,
然后調用函數 hash()在算一次,
最后把結果和當前hash大小進行計算找到存放該值的位置;
如果該位置有值 直接把當前值(entity)鏈接到該值最前面 ,
Entry<K,V> e = table[bucketIndex];
//這個地方獲取當前位置的 e
//table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
//這個地方把要插入的entity的next屬性指向 e,
然后把整個entity放入 hashMap的index位置,
如果沒有值就直接放入,
數組位置每變大一次 里面每個對象的位置都要重新計算一下 |
初始大小 |
16 |
擴容因子 |
數據超過當前大小*0.75 容量擴一倍 |
擴容例子 |
當前容量16 如果插入13個數 超過了(16*0.75=12)
容量增加16 最后容量是 32 |
優勢 |
查詢足夠快 |
線程是否安全 |
線程不安全 可以使用如下進行安全處理
Set s = Collections.synchronizedSet(new HashSet(...)) |
Hashtable |
初始大小 |
11 |
擴容因子 |
大小 = 大小 * 2 + 1 |
擴容例子 |
11 然后 23 然后47 .... |
是否同步 |
hashtable是同步的. |
優勢 |
查詢足夠快 |
說明 |
key 不允許為空
數據的put和get和hashMap基本上一致
里面的所有方法除了不需要同步的都有 synchronized |
LinkedHashMap |
初始大小 |
16 |
擴容因子 |
數據超過當前大小*0.75 容量擴一倍 |
擴容例子 |
當前容量16 如果插入13個數 超過了(16*0.75=12)
容量增加16 最后容量是 32 |
是否同步 |
異步線程不安全 多線程使用可以如下
Map m = Collections.synchronizedMap(new LinkedHashMap(...)) |
優勢 |
查詢足夠快的 有序 |
說明 |
鏈表的形式存儲數據 使用的hash算法保持數據,但同樣也維護了一個插入
順序查詢對象時,速度足夠快 |
TreeMap |
初始大小 |
0 |
擴容因子 |
1 |
擴容例子 |
每插入一個鍵值對,內部創建一個entity來存儲 size + 1 |
是否同步 |
異步線程不安全 多線程使用可以如下
Map m = Collections.synchronizedMap(new TreeMap(...)); |
優勢 |
能夠維護其內元素的排序狀態 |
說明 |
TreeMap 初始化為0 , 每插入一個鍵值對,內部創建一個entity來存儲
內部實現和維護的是一顆紅黑樹,遍歷的時候使用的是前序遍歷法,但是
查詢get方法的時候需要遍歷,速度不如直接使用hash算法的快 |
Properties |
初始大小 |
11 |
擴容因子 |
大小 = 大小 * 2 + 1 |
擴容例子 |
11 然后 23 然后47 .... |
是否同步 |
是同步的. |
優勢 |
查詢足夠快 可保存在流中或從流中加載數據 |
說明 |
實現了 HashTable 表示了一個持久的屬性集。
Properties 可保存在流中或從流中加載數據。
|