首頁  >  文章  >  Java  >  Java中的Set、List、Map的用法與區別介紹

Java中的Set、List、Map的用法與區別介紹

高洛峰
高洛峰原創
2017-01-22 15:19:461608瀏覽

Collection 介面 :Collection是最基本的集合接口,聲明了適用於JAVA集合(只包括Set和List)的通用方法。 Set和List都繼承了Conllection,Map

Collection介面的方法:

boolean add(Object o):向集合中加入一個物件的參考
void clear():刪除集合中所有的對象,即不再持有這些物件的參考
boolean isEmpty():判斷集合是否為空
boolean contains(Object o):判斷集合中是否持有特定物件的參考
Iterartor iterator():傳回一個Iterator對象,可以用來遍歷集合中的元素
boolean remove(Object o):從集合中刪除物件的參考

int size():傳回集合中元素的陣列

Object[] toArray():傳回一個陣列,該陣列中包含集合中的所有元素

關於:Iterator() 和toArray() 方法都用於集合的所有的元素,前者返回一個Iterator對象,後者返回一個包含集合中所有元素的數組。

Iterator介面宣告瞭如下方法:

hasNext():判斷集合中元素是否遍歷完畢,如果沒有,就回傳true
next():傳回下一個元素
remove():從集合中刪除上一個有next()方法傳回的元素。

Set(集合):Set是最簡單的一種集合。集合中的物件不按特定的方式排序,並且沒有重複物件。 Set介面主要實作了兩個實作類別:

HashSet:HashSet類別依照雜湊演算法來存取集合中的對象,存取速度比較快

TreeSet:TreeSet類別實作了SortedSet接口,能夠對集合中的對象進行排序。

Set的用法:存放的是物件的引用,沒有重複物件

Set set=new HashSet();
String s1=new String("hello");
String s2=s1;
String s3=new String("world");
set.add(s1);
set.add(s2);
set.add(s3);

System.out.println(set.size());//列印集合中物件的數目為 2。
Set 的 add()方法是如何判斷物件是否已經存放在集合中?

boolean isExists=false;
Iterator iterator=set.iterator();
while(it.hasNext()) {
String oldStr=it.next();
if(newStr.equals(oldStr)){
isExists=true;
}
}

List(列表):List的特徵是其元素以線性方式存儲,集合中可以存放重複物件。

List介面主要實作類別包括:
ArrayList() : 代表長度可以改變得數組。可以對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢。
LinkedList(): 在實作中採用鍊錶資料結構。插入和刪除速度快,存取速度慢。

對於List的隨機存取來說,就是只隨機來檢索位於特定位置的元素。 List 的 get(int index)方法放回集合中由參數index指定的索引位置的對象,下標從「0」 開始。最基本的兩種檢索集合中的所有物件的方法:

1:for循環和get()方法:

for(int i=0; i<list.size();i++){
System.out.println(list.get(i));
}

2:使用迭代器(Iterator):

Iterator it=list.iterator();
while(it.hashNext){
System.out.println(it.next);
}

Map(映射): Map是一種把鍵物件和值物件映射的集合,它的每個元素都包含一對鍵物件和值物件。
Map沒有繼承於Collection介面 從Map集合中檢索元素時,只要給出鍵對象,就會傳回對應的值物件。

Map 的常用方法:

1 添加,刪除操作:

Object put(Object key, Object value): 在集合中加入元素
Object remove(Object key): 刪除與KEYvo相關的元素
id put( Map t):  將來自特定映像的所有元素新增至該映像
void clear():從映像中刪除所有映射

2 查詢操作:

Object get(Object key):取得與關鍵字key相關的值。 Map集合中的鍵物件不允許重複,也就說,任兩個鍵物件透過equals()方法比較的結果都是false.,但是可以將任意多個鍵獨享映射到同一個值物件上。

Conllections:集合實用類別 。 Conllections提供了供JAVA集合實用的靜態方法

總結:

JAVA集合的基本用法,都歸納了,上面這些是平常最常用的JAVA集合,具體的其他的,還要參考JDK幫助文檔了,呵呵關於Map的應用,還有很多,具體就是這個,Conllections提供了很多List /Map 實用的方法,對平常開發非常有用。

boolean containsKey(Object key): 判斷映像中是否存在關鍵字key
boolean containsValue(Object value):判斷映像中是否存在值value
int size():傳回目前映像中對應的數量
boolean isEmpty() :判斷映像中是否有任何映射

List按對象進入的順序保存對象,不做排序或編輯操作。 Set對每個物件只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於 Set,而不關心它的順序--否則應該使用List)。
Map同樣對每個元素保存一份,但這是基於"鍵"的,Map也有內建的排序,因而不關心元素添加的 順序。如果加入元素的順序對你很重要,應該使用LinkedHashSet或LinkedHashMap.

List的功能方法:
其實有兩種:一種是基本的ArrayList,其優點在於隨機存取元素,另一種是更強大的LinkedList,它並不是為快速隨機存取設計的,而是具有一套更通用的方法。

List:次序是List最重要的特點:它保證維護元素特定的順序。 List為Collection增加了許多方法,使得能夠在List中間插入與移除元素(這只推薦LinkedList使用。)一個List可以產生ListIterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。
ArrayList:由陣列實作的List。允許對元素進行快速隨機訪問,但是向List中間插入與移除元素的速度很慢。 ListIterator只應該用來由後向前遍歷 ArrayList,而不是用來插入和移除元素。因為那比LinkedList開銷大很多。
LinkedList:對順序存取進行了最佳化,向List中間插入與刪除的開銷並不大。隨機存取則相對較慢。 (使用ArrayList代替。)還具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和removeLast(), 這些方法(沒有在任何接口或基類中定義過)使得LinkedList可以當作堆疊、佇列和雙向佇列使用。

Set的功能方法:
Set具有與Collection完全一樣的接口,因此沒有任何額外的功能,不像前面有兩個不同的L​​ist。實際上Set就是Collection,只 是行為不同。 (這是繼承與多態思想的典型應用:表現不同的行為。)Set不保存重複的元素(至於如何判斷元素相同則較為負責)

Set : 存入Set的每個元素都必須是唯一的,因為Set不保存重複元素。加入Set的元素必須定義equals()方法以確保物件的唯一性。 Set與Collection有完全一樣的介面。 Set介面不保證維護元素的次序。
HashSet:為快速找出設計的Set。存入HashSet的物件必須定義hashCode()。
TreeSet:保存次序的Set, 底層為樹狀結構。使用它可以從Set中提取有序的序列。

LinkedHashSet:具有HashSet的查詢速度,且內部使用鍊錶維護元素的順序(插入的次序)。於是在使用迭代器遍歷Set時,結果會依元素插入的順序顯示。

Map的功能方法:

方法put(Object key, Object value)增加一個「值」(想要得東西)和與「值」相關聯的「鍵」(key)(使用它來查找)。方法get(Object key)傳回與給定「鍵」相關聯的「值」。可以用containsKey()和containsValue()測試Map中是否包含某個「鍵」或「值」。
標準的Java類別庫中包含了幾種不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它們都有相同的基本介面Map,但是行為、效率、排序策略、保存物件的生命週期和判定「鍵」等價的策略等各不相同。
執行效率是Map的一大問題。看看get()要做哪些事,就會明白為什麼在ArrayList中搜尋「鍵」是相當慢的。而這正是HashMap提高速 度的地方。 HashMap使用了特殊的值,稱為「散列碼」(hash code),來取代對鍵的緩慢搜尋。
「散列碼」是「相對唯一」用以代表物件的int值,它是透過將該物件的某些資訊進行轉換而產生的。所有Java物件都能產生雜湊碼,因為hashCode()是定義在基底類別Object中的方法。
HashMap就是使用物件的hashCode()進行快速查詢的。此方法能夠顯著提高效能。

Map : 維護「鍵值對」的關聯性,讓你可以透過「鍵」找出「值」

HashMap:Map基於散列表的實作。插入和查詢「鍵值對」的開銷是固定的。可以透過構造器設定容量capacity和負載因子load factor,以調整容器的效能。
LinkedHashMap:類似HashMap,但是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代存取時發而更快,因為它使用鍊錶來維護內部次序。
TreeMap :基於紅黑樹資料結構的實作。當查看「鍵」或「鍵值對」時,它們會被排序(順序由Comparabel或Comparator決定)。 TreeMap的特徵在 於,你得到的結果是經過排序的。 TreeMap是唯一的帶有subMap()方法的Map,它可以傳回一個子樹。
WeakHashMap :弱鍵(weak key)Map,Map中使用的物件也被允許釋放: 這是為解決特殊問題設計的。如果沒有map之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。

IdentifyHashMap:使用==代替equals()對「鍵」進行比較的hash map。專為解決特殊問題而設計。

更多Java中的Set、List、Map的用法與區別介紹相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn