首頁 Java java教程 JAVA有關集合類別的總結

JAVA有關集合類別的總結

Jul 20, 2017 pm 01:17 PM
java 匯總 集合

一、集合與陣列

陣列(可以儲存基本資料型別)是用來存現物件的一種容器,但是陣列的長度固定,不適合在物件數量未知的情況下使用。

集合(只能儲存對象,物件類型可以不一樣)的長度可變,可在多數情況下使用。

二、層次關係

如圖所示:圖中,實線邊框的是實現類,折線邊框的是抽象類,而點線邊框的是接口

 

#Collection介面是集合類別的根接口,Java中沒有提供這個介面的直接的實作類別。但是卻讓其被繼承產生了兩個接口,就是Set和List。 Set中不能包含重複的元素。 List是一個有序的集合,可以包含重複的元素,提供了按索引存取的方式。

Map是Java.util套件中的另一個接口,它和Collection接口沒有關係,是相互獨立的,但是都屬於集合類別的一部分。 Map包含了key-value對。 Map不能包含重複的key,但可以包含相同的value。

Iterator,所有的集合類,都實現了Iterator接口,這是一個用於遍歷集合中元素的接口,主要包含以下三種方法:
1.hasNext()是否還有下一個元素。
2.next()傳回下一個元素。
3.remove()刪除目前元素。

三、幾個重要的介面和類別簡介

1、List(有序、可重複)
List裡存放的物件是有順序的,同時也是可以重複的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。因為往list集合裡插入或刪除資料時,會伴隨著後面資料的移動,所有插入刪除資料速度都慢。

2、Set(無序、不能重複)
Set裡存放的物件是無序,不能重複的,集合中的物件不按特定的方式排序,只是簡單地把物件加入集合中。

3、Map(鍵值對、鍵唯一、值不唯一)
Map集合中儲存的是鍵值對,鍵不能重複,值可以重複。根據鍵得到值,對map集合遍歷時先得到鍵的set集合,對set集合進行遍歷,得到對應的值。

比較如下:

 

四、遍歷

 在類別集中提供了以下四種的常見輸出方式:

1)Iterator:迭代輸出,是使用最多的輸出方式。

2)ListIterator:是Iterator的子接口,專門用來輸出List中的內容。

3)foreach輸出:JDK1.5之後提供的新功能,可以輸出陣列或集合。

4)for迴圈

程式碼範例如下:

 for的形式:for(int i=0;i

 foreach的形式: for(int i:arr){...}

 iterator的形式:
Iterator it = arr.iterator();
while (it.hasNext()){ object o =it.next(); ...}

五、ArrayList和LinkedList

ArrayList和LinkedList在用法上沒有差別,但是在功能上還是有差別的。 LinkedList常用在增刪操作較多而查詢操作很少的情況下,ArrayList則相反。

六、Map集合

實作類別:HashMap、Hashtable、LinkedHashMap和TreeMap

HashMap 

#HashMap是最常用的Map,它根據鍵的HashCode值儲存數據,根據鍵可以直接獲取它的值,具有很快的存取速度,遍歷時,取得數據的順序是完全隨機的。因為鍵物件不可以重複,所以HashMap最多只允許一筆記錄的鍵為Null,允許多筆記錄的值為Null,是非同步的

Hashtable

Hashtable與HashMap類似,是HashMap的線程安全版,它支援線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢,它繼承自Dictionary類,不同的是它不允許記錄的鍵或值為null,同時效率較低。

ConcurrentHashMap

線程安全,並且鎖定分離。 ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段落上,它們就可以並發進行。

LinkedHashMap

LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的,在遍歷的時候會比HashMap慢,有HashMap的全部特性。

TreeMap

TreeMap實作SortMap接口,能夠把它保存的記錄根據鍵排序,預設是按鍵值的升序排序(自然順序),也可以指定排序的比較器,當用Iterator遍歷TreeMap時,所得到的記錄是排過序的。不允許key值為空,非同步的;

map的遍歷

第一種:KeySet()
將Map中所有的鍵存入到set集合中。因為set具備迭代器。所有可以迭代方式取出所有的鍵,再根據get方法。取得每一個鍵對應的值。 keySet():迭代後只能透過get()取key 。
取到的結果會亂序,是因為取得資料行主鍵的時候,使用了HashMap.keySet()方法,而這個方法回傳的Set結果,裡面的資料是亂序排放的。
典型用法如下:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put("key3","lisi3");
map.put("key4","lisi4");  
//先取得map集合的所有鍵的set集合,keyset( )
Iterator it = map.keySet().iterator();
 //取得迭代器
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}

第二種:entrySet()
Set> entrySet( ) //傳回此映射中包含的映射關係的Set 視圖。 (一個關係就是一個鍵-值對),就是把(key-value)當作一個整體一對一對地存放到Set集合當中的。 Map.Entry表示映射關係。 entrySet():迭代後可以e.getKey(),e.getValue()兩種方法來取key和value。回傳的是Entry介面。
典型用法如下:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put("key3","lisi3");
map.put("key4","lisi4");
//將map集合中的映射關係取出,存入set集合
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out .println("鍵"+e.getKey () + "的值為" + e.getValue());
}
建議使用第二種方式,即entrySet()方法,效率較高。
對於keySet其實遍歷了2次,一次是轉為iterator,一次就是從HashMap中取出key所對於的value。而entryset只是遍歷了第一次,它把key和value都放到了entry中,所以快了。兩種遍歷的遍歷時間相差還是很明顯的。

七、主要實作類別區別小結

Vector和ArrayList
1,vector是線程同步的,所以它也是線程安全的,而arraylist是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用arraylist效率比較高。
2,若集合中的元素的數目大於目前集合數組的長度時,vector增長率為目前數組長度的100%,而arraylist增長率為目前數組長度的50%。如果在集合中使用資料量比較大的數據,用vector有一定的優勢。
3,如果查找指定位置的數據,vector和arraylist使用的時間是相同的,如果頻繁的存取數據,這個時候使用vector和arraylist都可以。而如果移動一個指定位置會導致後面的元素都發生移動,這個時候就應該考慮到使用linklist,因為它移動一個指定位置的資料時其它元素不移動。
ArrayList 和Vector是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,都允許直接序號索引元素,但是插入數據要涉及到數組元素移動等內存操作,所以索引資料快,插入資料慢,Vector由於使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鍊錶實現存儲,按序號索引資料需要進行向前或向後遍歷,但是插入資料時才需要記錄本項的前後項即可,所以插入數度較快。

arraylist和linkedlist
1.ArrayList是實作了基於動態陣列的資料結構,LinkedList基於鍊錶的資料結構。
2.對於隨機存取get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。 這一點要看實際情況的。若只對單一資料插入或刪除,ArrayList的速度反而優於LinkedList。但若是批量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 因為ArrayList每插入一條數據,要移動插入點及之後的所有數據。

HashMap與TreeMap
1、 HashMap透過hashcode對其內容進行快速查找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
2、在Map 中插入、刪除和定位元素,HashMap是最好的選擇。但如果您要按自然順序或自訂順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求新增的鍵類別明確定義了hashCode()和 equals()的實作。
兩個map中的元素一樣,但順序不一樣,導致hashCode()不一樣。
同樣做測試:
在HashMap中,同樣的值的map,順序不同,equals時,false;
而在treeMap中,同樣的值的map,順序不同,equals時,true,說明,treeMap在equals()時是整理順序了的。

HashTable與HashMap
1、同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是線程式不安全的,不是同步的。
2、HashMap允許存在一個為null的key,多個為null的value 。
3、hashtable的key和value都不允許為null。

 

 

#是否有序

是否允許元素重複

#Collection

List

##是

Set

#AbstractSet

# 

HashSet

 

#TreeSet

是(用二元排序樹)

Map

#AbstractMap

使用key-value來映射和儲存數據,key必須唯一,value可以重複

 

##HashMap

 

#TreeMap

是(用二元排序樹)

以上是JAVA有關集合類別的總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

See all articles