日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

走进Java中的持有对象(容器类)之一 容器分类

發(fā)布時(shí)間:2024/2/28 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 走进Java中的持有对象(容器类)之一 容器分类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。