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 |
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.HashMap和Hashtable的操作是相同的,他們的區別如下:
Hashtable是執行緒安全的,HashMap是非執行緒安全的。所有HashMap比Hashtable的效能更高。
Hashtable不允許使用使用null值作為key或value,但是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);
}
}
}