走进Java中的持有对象(容器类)之一 容器分类
轉(zhuǎn)載自?https://www.cnblogs.com/ACFLOOD/p/5555555.html
Java容器可以說是增強(qiáng)程序員編程能力的基本工具,本系列將帶您深入理解容器類。
容器的用途
如果對(duì)象的數(shù)量與生命周期都是固定的,自然我們也就不需要很復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
我們可以通過創(chuàng)建引用來持有對(duì)象,如
Class clazz;也可以通過數(shù)組來持有多個(gè)對(duì)象,如
Class[] clazs = new Class[10];然而,一般情況下,我們并不知道要?jiǎng)?chuàng)建多少對(duì)象,或者以何種方式創(chuàng)建對(duì)象。數(shù)組顯然只能創(chuàng)建固定長(zhǎng)度的對(duì)象,為了使程序變得更加靈活與高效,Java類庫(kù)提供了一套完整的容器類,具備完善的方法來解決上述問題。
?
? ? 2. ?容器的類別
觀察上圖,我們可以得出容器主要分為兩種類型,兩個(gè)接口Collection與Map定義了兩類不同的對(duì)象存儲(chǔ)方式。
Collection用以保存單一的元素,Map保存關(guān)聯(lián)鍵值對(duì)。通過泛型來指定容器存放的數(shù)據(jù)類型。?Iterator?設(shè)計(jì)的目的是在未知容器具體的類型的情況下,用來遍歷容器元素。剩下的容器類型都是繼承了這兩個(gè)接口。
在實(shí)際編碼中,通過向上轉(zhuǎn)型為接口,在其與代碼中都使用這個(gè)接口是非常普遍的使用方式。如下:
?
import java.util.*;public class TestCollection {public static void main(String[] args){Collection<Integer> c = new ArrayList<Integer>();for(int i = 0; i < 10; i++){c.add(i); }for(Integer i : c){System.out.print(i + ", ");}}}?
注:由于List接口的方法比Collection更為豐富,所以 實(shí)際應(yīng)用中,ArrayList向上轉(zhuǎn)型為L(zhǎng)ist更為合適。
剛剛接觸容器的朋友們可能會(huì)只把Collection與Map當(dāng)做接口,實(shí)際上并非如此,容器中的接口其實(shí)有六個(gè)。
? ? ?
? ? 3. ?容器中的七大接口
Collection接口
Map接口
Set接口
List接口
Queue接口
Iterator接口
Comparable接口
其中List, Queue和Set接口繼承了Collection接口,剩下的接口之間都是相互獨(dú)立的,無繼承關(guān)系。List和Set接口主要是為了區(qū)分是否要包含重復(fù)元素,Iterater迭代器則是為了更靈活的迭代集合,與foreach一起使用。Comparable接口則用于比較。
?
? ? 4. ?各類容器的功能(主要實(shí)現(xiàn)類分析)
-
Collection接口
-
List接口(相比Collection, 添加了新的方法)
-
ArrayList
-
-
? ? ? ? ? ? ? ? ? ? 實(shí)現(xiàn)List接口,類似于動(dòng)態(tài)數(shù)組,適用于大量隨機(jī)訪問的情況。但插入和刪除的代價(jià)非常高昂
-
LinkedList
? ? ? ? ? ? ? ? ? ? ?實(shí)現(xiàn)List接口,類似于鏈表,也提供了優(yōu)化的順序訪問。在插入和刪除方面代價(jià)低廉,隨機(jī)訪問代價(jià)較高
-
Set接口(方法與Collection完全相同)
-
HashSet
-
? ? ? ? ? ? ? ? ? ? HashSet使用了散列函數(shù)實(shí)現(xiàn),極大的提高了訪問速度。存入HashSet的對(duì)象必須定義hashCode()
?
import java.util.*;public class IntegerSet{private static Random rand;public static void main(String[] args){rand = new Random(47);Set<Integer> intset = new HashSet<Integer>();for(int i = 0; i < 10000; i++){intset.add(rand.nextInt(30));}System.out.println(intset);}}?
? ? ? ? ? ? ? ? ? ? ? 本例中,intset中插入了10000次,由于不保留重復(fù)元素最后輸出結(jié)果數(shù)目<=30。
-
TreeSet
? ? ? ? ? ? ? ? ? ? ?TreeSet使用紅黑樹來實(shí)現(xiàn)存儲(chǔ)元素, 紅黑樹的好處是可以插入之后維持集合的有序性。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
import java.util.*;public class SortIntegerSet {private static Random rand;public static void main(String[] args) {rand = new Random(47);Set<Integer> sintset = new TreeSet<Integer>();for(int i = 0; i < 10000; i++){sintset.add(rand.nextInt(20));}System.out.println(sintset);}}?
-
LinkedHashSet
? ? ? ? ? ? ? ? ? ? ?顧名思義,LinkedHashSet使用了鏈表來保持插入順序,不過為了提高查詢效率,也使用了散列。
-
Queue接口
-
LinkedList
-
? ? ? ? ? ? ? ? ? ? LinkedList實(shí)現(xiàn)了Queue接口,提供了方法支持隊(duì)列的行為,在以后的系列我們會(huì)深入講解如何用 ? ? ? ? ? ? ??
? ? ? ? ? ? ?LinkedList實(shí)現(xiàn)隊(duì)列。
-
PriorityQueue
? ? ? ? ? ? ? ? ? ? ?與普通隊(duì)列不同,優(yōu)先隊(duì)列每次彈出的是優(yōu)先級(jí)最高的元素。可以通過提供自己的Comparator來修改 ? ??
? ? ? ? ? ? ? 默認(rèn)的優(yōu)先級(jí)順序。? ? ? ?
-
Map接口
-
HashMap
-
? ? ? ? ? ? ?HashMap通過散列機(jī)制,用來快速訪問。
-
TreeMap
? ? ? ? ? ? TreeMap保持"key"處于排序狀態(tài),訪問速度不如HashMap
-
LinkedHashMap
? ? ? ? ? ? LinkedHashMap保持元素插入時(shí)順序,同時(shí)提供散列實(shí)現(xiàn)快速訪問
? ? 關(guān)于Map的散列實(shí)現(xiàn)是非常重要的,實(shí)現(xiàn)Map的原理(關(guān)聯(lián)數(shù)組等),hashCode()方法的理解,本系列后面會(huì)一一分析。
?
? ? 5. ?總結(jié)
通過本文的學(xué)習(xí),相信讀者對(duì)容器的用途,分類,以及容器的層次結(jié)構(gòu)與一些常用容器的基本功能和用法有了較為清晰地了解。然而,想要更好的使用容器類,還必須了解每種容器具體的方法,源碼,以及線程安全的實(shí)現(xiàn)。在本系列的后續(xù)部分,將帶大家繼續(xù)深入討論這些內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的走进Java中的持有对象(容器类)之一 容器分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式事物(2PC,3PC,CAP,柔性
- 下一篇: java美元兑换,(Java实现) 美元