1. 程式人生 > >List Map Set集合之間的區別

List Map Set集合之間的區別

1.集合框架介紹 

計算機的優勢在於處理大量的資料,在程式設計開發中,為處理大量的資料,必須具備相應的儲存結構,之前學習的陣列可以用來儲存並處理大量型別相同的資料,但是通過上面的課後練習,會發現陣列在應用中的限制:陣列長度一旦確定,就無法更改;除非採用建立新陣列,再將原陣列內容拷貝過來;陣列中只能存放指定型別的資料,操作不方便。在實際開發中,為了操作方便,JDK中提供了List集合。

List集合與陣列的用途非常相似,都是用來儲存大量資料的,不同處有兩點:

1. 陣列長度在使用前必須確定,一旦確定不能改變。而List集合長度可變,無需定義。

2. 陣列中必須存放同一型別的資料,List集合中可以存放不同型別的資料。

List集合是Java集合框架中的一種,另外兩種集合Set和Map會在下面介紹。List集合在JDK中被封裝稱為介面,針對List介面,有若干種實現,常用的有三個子類,即ArrayList、Vector和LinkedList。這三個類的功能與用法相同,但內部實現方式不同。下面以ArrayList為例介紹集合的常用操作,Vector和LinkedList的使用方法與ArrayList類似。

2. 集合的常用方法

(1)list集合常用方法:

返回型別

方法名稱

說明

boolean

add(Object obj)

加入元素,返回是否新增成功

boolean

clear()

清除集合中的元素

boolean

contains(Object obj)

查詢集合中是否存在傳入的元素

Object

get(int index)

獲取指定位置的元素

boolean

isEmpty()

判斷集合是否為空

Object

remove(int index)

刪除制定位置的元素,並返回該元素

int

size()

獲取集合大小

Object[]

toArray()

將集合轉換成一個數組


(2)HashMap集合常用方法:

返回型別

方法名稱

作用

  Objec

t

put(Object key,Object value)

加入元素返回與此key關聯的原有的value,不存在則返回null

     void

clear()

從集合中移除所有的元素

  boolean

containsKey(Object key)

根據key從集合中判斷key是否存在

  boolean

containsValue(Object value)

根據value從集合中判斷value是否存在

  Object

get(Object key)

根據key返回key對應的值

      Set

keySet()

返回Map集合中包含的鍵集合

  Object

remove(Object key)

從集合中刪除key對應的元素,返回與key對應的原有value,不存在則返回null

       int 

size()

返回集合中的元素的數量



(3)HashMap集合常用方法:

Set集合和List集合的很多的用法是相同的。但是Set集合中的元素是無序的,元素也是不能重複的。Set集合中常用類為HashSet。

HashSet類中常用的方法如下:

返回型別

方法名稱

作用

boolean

add(Object obj)

加入元素

void

clear()

移除Set集合中所有元素

boolean

contains(Object obj)

判斷Set集合中是否包含指定元素

boolean

isEmpty()

判斷Set集合是否為空

Iterator

iterator()

返回Set集合中對元素迭代的迭代器

boolean

remove(Object obj)

從集合中刪除元素

Int

size()

返回集合中的元素數量


3. 三種List集合的比較

我們說過,ArrayList、Vector與LinkedList的使用方法相同,內部實現方式不同。而內部實現方式的不同又決定了三種集合的適用範圍,瞭解三種集合的內部實現,才能正確的選擇使用型別。

ArrayList與Vector比較

ArrayList與Vector的內部實現類似,Vector設計為執行緒安全,ArrayList設計為非執行緒安全。為了保證執行緒安全,Vector在效能方面稍遜於ArrayList,目前我們編寫的都是單執行緒應用程式,應選擇使用ArrayList

ArrayList與LinkedList

ArrayList與LinkedList均設計為非執行緒安全,ArrayList內部採用陣列實現(與Vector相同),LinkedList內部採用連結串列結構實現。

ArrayList採用陣列儲存元素,意味著當大量新增元素,陣列空間不足時,依然需要通過新建陣列、記憶體複製的方式來增加容量,效率較低;而當進行對陣列進行插入、刪除操作時,又會進行迴圈移位操作,效率也較低;只有進行按下標查詢時(get方法),使用陣列效率很高。

LinkedList採用連結串列儲存元素,在新增元素時只需要進行一次簡單的記憶體分配即可,效率較高;進行插入、刪除操作時,只需對連結串列中相鄰的元素進行修改即可,效率也很高;但進行按下標查詢時,需要對連結串列進行遍歷,效率較低。

可以總結出ArrayList在進行資料的新增、插入、刪除時效率較低,按下標對資料進行查詢時效率較高;LinkedList正好相反。一般來說ArrayList儲存經常進行查詢操作的集合,LinkedList適用於儲存經常進行修改操作的集合

注:

1.通過List集合提供的各種方法來對其中的元素進行操作,從而可以方便使用者操作,但是如果要從List集合中獲取一個特定的物件,操作是比較繁瑣的,此中情況下用Map比較適合。Map集合用於儲存具有對映關係的資料,即以鍵值對(key->value)的方式來儲存資料。因此在Map集合內部有兩個集合,一個集合用於儲存Map中的key(鍵),一個集合用於儲存Map中的value(值),其中key和value可以是任意資料型別資料。

2.HashMapHashtable的操作是相同的,他們的區別如下:

Hashtable是執行緒安全的,HashMap是非執行緒安全的。所有HashMapHashtable的效能更高。

Hashtable不允許使用使用null值作為keyvalue,但是HashMap是可以的。

3.set集合的迭代

import java.util.HashSet;
import java.util.Iterator;
public class SetIterator {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
Iterator iter = set.iterator();  ①
while (iter.hasNext()) {  ②
String str = (String) iter.next();  ③
System.out.println(str);
}
}
}