Java常見的容器類及其區別
一、分類:大型別主要分為以下兩種型別
1)Collection:一個獨立元素的序列,這些元素都服從一條或者多條規則。 List必須按照插入的順序儲存元素,而set不能有重複的元素。Queue按照排隊規則來確定物件產生的順序(通常與它們被插入的順序相同)。
2)Map:一組成對的“鍵值對”物件,允許你使用鍵來查詢值。
細分如下:
|Collection
| ├List
| │--├LinkedList
| │--├ArrayList
| │--└Vector
| │ └Stack
| ├Set
| │--├HashSet
| │--├TreeSet
| │--└LinkedSet
|
|Map
├Hashtable
├HashMap
└WeakHashMap
二、具體區別
Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子介面”如List和Set。
主要方法: boolean add(Object o)新增物件到集合 boolean remove(Object o)刪除指定的物件 int size()返回當前集合中元素的數量 boolean contains(Object o)查詢集合中是否有指定的物件 boolean isEmpty()判斷集合是否為空 Iterator iterator()返回一個迭代器 boolean containsAll(Collection c)查詢集合中是否有集合c中的元素 boolean addAll(Collection c)將集合c中所有的元素新增給該集合 void clear()刪除集合中所有元素 void removeAll(Collection c)從集合中刪除c集合中也有的元素 void retainAll(Collection c)從集合中刪除集合c中不包含的元素
1、List介面
實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。
共同點:
LinkedList、ArrayList都實現了List介面,都是不同步的,執行緒不安全,元素是有序的、可重複
1)LinkedList類
基於連結串列的資料結構,允許null元素,增加、刪除、修改元素方面效率比ArrayList高。
此外LinkedList提供額外的get,remove,insert方法在 LinkedList的首部或尾部。這些操作使LinkedList可被用作堆疊(stack),佇列(queue)或雙向佇列(deque)。
注意:LinkedList沒有同步方法。如果多個執行緒同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在建立List時構造一個同步的List:List list = Collections.synchronizedList(new LinkedList(…));
2) ArrayList類
基於陣列的資料結構,不同步,執行緒安全,查詢(get set)效率高。
size,isEmpty,get,set方法執行時間為常數。但是add方法開銷為分攤的常數,新增n個元素需要O(n)的時間。其他的方法執行時間為線性。每個ArrayList例項都有一個容量(Capacity),即用於儲存元素的陣列的大小。這個容量可隨著不斷新增新元素而自動增加,但是增長演算法並 沒有定義。當需要插入大量元素時,在插入前可以呼叫ensureCapacity方法來增加ArrayList的容量以提高插入效率。
一般情況下使用這兩個就可以了,因為非同步,所以效率比較高。
如果涉及到堆疊,佇列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。
___________________________________________________________________________________________________
Array和ArrayList的區別及各自適用的場景
Array是陣列,ArrayList是Array的加強版。
(1)array可以儲存基本型別和物件型別,arrayList只能儲存物件型別
(2)array陣列的大小是固定的不能更改,而ArrayList的大小可以改變
(3)Array陣列在存放的時候一定是同種型別的元素。ArrayList就不一定了,因為ArrayList可以儲存Object。
(4)ArrayList有更加豐富的方法如addAll()、removeAll()、iterator()
適用場景:
如果想要儲存一些在整個程式執行期間都會存在而且不變的資料,我們可以將它們放進一個全域性數組裡,但是如果我們單純只是想要以陣列的形式儲存資料,而不對資料進行增加等操作,只是方便我們進行查詢的話,那麼,我們就選擇ArrayList。而且還有一個地方是必須知道的,就是如果我們需要對元素進行頻繁的移動或刪除,或者是處理的是超大量的資料,那麼,使用ArrayList就真的不是一個好的選擇,因為它的效率很低,使用陣列進行這樣的動作就很麻煩,那麼,我們可以考慮選擇LinkedList。
________________________________________________________________________________________________
3)Vector類
Vector非常類似ArrayList,但是Vector是同步的。由Vector建立的Iterator,雖然和ArrayList建立的 Iterator是同一介面,但是,因為Vector是同步的,當一個 Iterator被建立而且正在被使用,另一個執行緒改變了Vector的狀態(例 如,新增或刪除了一些元素),這時呼叫Iterator的方法時將丟擲 ConcurrentModificationException,因此必須捕獲該 異常。
4)Stack 類
Stack繼承自Vector,實現一個後進先出的堆疊。Stack提供5個額外的方法使得Vector得以被當作堆疊使用。基本的push和pop方 法,還有 peek方法得到棧頂的元素,empty方法測試堆疊是否為空,search方法檢測一個元素在堆疊中的位置。Stack剛建立後是空棧。
2、Set介面
Set容器類主要有HashSet和TreeSet等。
共同點:
元素不重複
實現了Java.util.Set介面。
1)HashSet類
-> 不保證集合中元素的順序
->允許包含值為null的元素,但最多隻能有一個null元素。
public class TestHashSet
{
public static void main(String [] args)
{
HashSet h=new HashSet();
h.add("1st");
h.add("2nd");
h.add(new Integer(3));
h.add(new Double(4.0));
h.add("2nd"); //重複元素,未被新增
h.add(new Integer(3)); //重複元素,未被新增
h.add(new Date());
System.out.println("開始:size="+h.size());
Iterator it=h.iterator();
while(it.hasNext())
{
Object o=it.next();
System.out.println(o);
}
h.remove("2nd");
System.out.println("移除元素後:size="+h.size());
System.out.println(h);
}
}
2)TreeSet
TreeSet描述的是Set的一種變體——可以實現排序等功能的集合,它在講物件元素新增到集合中時會自動按照某種比較規則將其插入到有序的物件序列中,並保證該集合元素組成的讀uixiangxulie時刻按照“升序”排列。
public class TestTreeSet
{
public static void main(String [] args)
{
TreeSet ts=new TreeSet();
ts.add("orange");
ts.add("apple");
ts.add("banana");
ts.add("grape");
Iterator it=ts.iterator();
while(it.hasNext())
{
String fruit=(String)it.next();
System.out.println(fruit);
}
}
}
三、Map集合介面
Map沒有繼承Collection介面,Map提供key到value的對映。一個Map中不能包含相同的key,每個key只能對映一個 value。Map介面提供3種集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value對映。
主要方法:
boolean equals(Object o)比較物件
boolean remove(Object o)刪除一個物件
put(Object key,Object value)新增key和value
Hashtable類
HashTable和HashMap區別
第一、繼承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
第二、Hashtable 中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。在多執行緒併發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。
第三、Hashtable中,key和value都不允許出現null值。在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。
第四、兩個遍歷方式的內部實現上不同。Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。
第五、雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。
3、WeakHashMap類
WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那麼該key可以被GC回收。