Collection 介紹

collection1.png

  Java的類集(Collection)框架使你的程序處理對象組的方法標準化。類集框架被設計用于適應幾個目的荣茫。首先胯盯,這種框架是高性能的。對基本類集(動態(tài)數組计露,鏈接表博脑,樹和散列表)的實現(xiàn)是高效率的憎乙。一般很少需要人工去對這些“數據引擎”編寫代碼(如果有的話)。第二點叉趣,框架必須允許不同類型的類集以相同的方式和高度互操作方式工作泞边。第三點,類集必須是容易擴展和/或修改的疗杉。為了實現(xiàn)這一目標阵谚,類集框架被設計成包含一組標準的接口。對這些接口烟具,提供了幾個標準的實現(xiàn)工具(例如LinkedList梢什,HashSet和TreeSet),通常就是這樣使用的朝聋。如果你愿意的話嗡午,也可以實現(xiàn)你自己的類集。為了方便起見冀痕,創(chuàng)建用于各種特殊目的的實現(xiàn)工具荔睹。一部分工具可以使你自己的類集實現(xiàn)更加容易。最后言蛇,增加了允許將標準數組融合到類集框架中的機制僻他。
Set接口:
  集合接口定義了一個集合。它擴展了Collection并說明了不允許復制元素的類集的特性腊尚。因此吨拗,如果試圖將復制元素加到集合中時,add()方法將返回false(不拋異常)婿斥。
HashSet:
  對于 HashSet 而言丢胚,它是基于 HashMap 實現(xiàn)的,HashSet 底層采用 HashMap 來保存所有元素受扳,因此 HashSet 的實現(xiàn)比較簡單,它只是封裝了一個 HashMap 對象來存儲所有的集合元素兔跌,所有放入 HashSet 中的集合元素實際上由 HashMap 的 key 來保存勘高,而 HashMap 的 value 則存儲了一個 PRESENT,它是一個靜態(tài)的 Object 對象坟桅。 HashSet 的絕大部分方法都是通過調用 HashMap 的方法來實現(xiàn)的华望,因此 HashSet 和 HashMap 兩個集合在實現(xiàn)本質上是相同的。

    private transient HashMap<E,Object> map;
    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }```
TreeSet:
  TreeSet是實現(xiàn)了SortedSet接口仅乓,SortedSet接口定義了幾種方法赖舟,使得對集合的處理更加方便。調用first()方法夸楣,可以獲得集合中的第一個對象宾抓。調用last()方法子漩,可以獲得集合中的最后一個元素。調用subSet()方法石洗,可以獲得排序集合的一個指定了第一個和最后一個對象的子集合幢泼。如果需要得到從集合的第一個元素開始的一個子集合,可以使用headSet()方法讲衫。如果需要獲得集合尾部的一個子集合,可以使用tailSet()方法。
  TreeSet支持兩種排序方法:自然排序和定制排序鄙漏。
  自然排序:TreeSet調用集合元素的compareTo(Object obj)方法來比較元素之間的大小草冈,然后按照元素升序排列。這就要求對象元素必須實現(xiàn)Comparable接口中的compareTo(Object obj)方法枷畏。在自然排序下别厘,TreeSet判斷兩個對象是否相同的唯一標準:兩個對象通過compareTo(Object o)方法比較是否相等:該方法返回0,則認為相等矿辽,返回1則認為不相等丹允。java的一些常見的類,例如Character袋倔,String雕蔽,Date等已經實現(xiàn)了Comparable接口。
  定制排序:在創(chuàng)建TreeSet集合對象時宾娜,需要關聯(lián)一個Comparator對象批狐,并且實現(xiàn)Comparator中的compare(T obj1,T obj 2)。當通過Comparator對象實現(xiàn)TreeSet的定制排序時前塔,也不可以向TreeSet中添加不同類型的對象(public TreeSet(Comparator<? super E> comparator))嚣艇。

public class Text {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<String>();
set.add("c");
set.add("a");
set.add("ef");
set.add("b");
set.add("e");
set.add("d");
SortedSet<String> subSet1 = set.subSet("b", "e");
System.out.println(subSet1); //[b, c, d]
SortedSet<String> subSet2 = set.headSet("b");
System.out.println(subSet2); //[a]
SortedSet<String> subSet3 = set.tailSet("e");
System.out.println(subSet3); //[e, ef]
}
}```
  用Set獲取數據時只能用迭代或者foreach來取值。
List接口
  List是有序的Collection华弓,使用此接口能夠精確的控制每個元素插入的位置食零。用戶能夠使用索引(元素在List中的位置,類似于數組下 >標)來訪問List中的元素寂屏,這類似于Java的數組贰谣。
ArrayList:
  ArrayList是一個基于數組上的鏈表,它擴展AbstractList并執(zhí)行List接口迁霎。ArrayList支持可隨需要而增長的動態(tài)數組吱抚。在Java中,標準數組是定長的考廉。在數組創(chuàng)建之后秘豹,它們不能被加長或縮短,這也就意味著你必須事先知道數組可以容納多少元素昌粤。但是既绕,你直到運行時才能知道需要多大的數組啄刹。為了解決這個問題,類集框架定義了ArrayList岸更。本質上鸵膏,ArrayList是對象引用的一個變長數組。也就是說怎炊,ArrayList能夠動態(tài)地增加或減小其大小谭企。數組列表以一個原始大小被創(chuàng)建。當超過了它的大小评肆,類集自動增大(當前長度的1.5倍债查,初始化長度為10,這里可以用初始化長度來進行性能優(yōu)化)瓜挽。
  當使用ArrayList時盹廷,有時想要獲得一個實際的數組,這個數組包含了列表的內容久橙《碚迹可以通過調用方法toArray()來實現(xiàn)它。(數組轉list:Arrays.asList()返回一個受指定數組支持的固定大小的列表)

public class Text {
    public static void main(String[] args) {
        String[] array = new String[2];
        List<String> list2 = Arrays.asList(array);
        array[0] = "test2";
        System.out.println(list2);
        list2.add("test");
        System.out.println(list2);
    }
}```
在add時會拋出UnsupportedOperationException淆衷,原因是asList返回的是一個Array的一個內部類而不是真正的ArrayList:

![image.png](http://upload-images.jianshu.io/upload_images/5793795-394940c6e959ab04.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Vector: 
  同ArrayList一樣是一個基于數組上的鏈表缸榄,但是不同的是Vector是同步的。
LinkedList:
  與ArrayList一樣實現(xiàn)List接口祝拯,只是ArrayList是List接口的大小可變數組的實現(xiàn)甚带,LinkedList是List接口鏈表的實現(xiàn)〖淹罚基于鏈表實現(xiàn)的方式使得LinkedList在插入和刪除時更優(yōu)于ArrayList鹰贵,而隨機訪問則比ArrayList遜色些。
  LinkedList除了它繼承的方法之外康嘉,LinkedList類本身還定義了一些有用的方法碉输,這些方法主要用于操作和訪問列表。使用addFirst()方法可以在列表頭增加元素亭珍;使用敷钾。使用add()方法的add(int, Object)形式,插入項目到指定的位置块蚌。調用getFirst()方法可以獲得第一個元素。調用getLast()方法可以得到最后一個元素膘格。為了刪除第一個元素峭范,可以使用removeFirst()方法;為了刪除最后一個元素瘪贱,可以調用removeLast()方法纱控。

  List 在很多方面跟 Array 數組感覺很相似辆毡,尤其是 ArrayList,那 List 和數組究竟哪個更好呢甜害?
  相似之處: 
    都可以表示一組同類型的對象
    都使用下標進行索引
  不同之處: 
    數組可以存任何類型元素
    List 不可以存基本數據類型舶掖,必須要包裝
    數組容量固定不可改變;List 容量可動態(tài)增長
    數組效率高; List 由于要維護額外內容尔店,效率相對低一些
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末眨攘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嚣州,更是在濱河造成了極大的恐慌鲫售,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该肴,死亡現(xiàn)場離奇詭異情竹,居然都是意外死亡,警方通過查閱死者的電腦和手機匀哄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門秦效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涎嚼,你說我怎么就攤上這事阱州。” “怎么了铸抑?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵贡耽,是天一觀的道長。 經常有香客問我鹊汛,道長蒲赂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任刁憋,我火速辦了婚禮滥嘴,結果婚禮上,老公的妹妹穿的比我還像新娘至耻。我一直安慰自己若皱,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布尘颓。 她就那樣靜靜地躺著走触,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疤苹。 梳的紋絲不亂的頭發(fā)上互广,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼惫皱。 笑死像樊,一個胖子當著我的面吹牛,可吹牛的內容都是我干的旅敷。 我是一名探鬼主播生棍,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媳谁!你這毒婦竟也來了涂滴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤韩脑,失蹤者是張志新(化名)和其女友劉穎氢妈,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體段多,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡首量,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了进苍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片加缘。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖觉啊,靈堂內的尸體忽然破棺而出拣宏,到底是詐尸還是另有隱情,我是刑警寧澤杠人,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布勋乾,位于F島的核電站,受9級特大地震影響嗡善,放射性物質發(fā)生泄漏辑莫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一罩引、第九天 我趴在偏房一處隱蔽的房頂上張望各吨。 院中可真熱鬧,春花似錦袁铐、人聲如沸揭蜒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屉更。三九已至,卻和暖如春洒缀,著一層夾襖步出監(jiān)牢的瞬間瑰谜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工似舵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葱峡。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓砚哗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砰奕。 傳聞我的和親對象是個殘疾皇子蛛芥,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法军援,內部類的語法仅淑,繼承相關的語法,異常的語法胸哥,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 集合類簡介 為什么出現(xiàn)集合類?面向對象語言對事物的體現(xiàn)都是以對象的形式嘲更,所以為了方便對多個對象的操作筐钟,就要對對象進...
    阿敏其人閱讀 1,417評論 0 7
  • 一篓冲、基本數據類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數值 對于byte類型而言...
    龍貓小爺閱讀 4,265評論 0 16
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,500評論 0 3
  • 漸漸的習慣了一個人 漸漸的發(fā)現(xiàn)一個人有時候真的很好 一個人的你可以安靜的,自由的做很多自己想要做的琳拨,不需要考慮別人...
    阿晶晶晶閱讀 229評論 0 2