Collection詳解

新手,剛開始寫。如果有沒明白可以在下面評論哦黎休,每天晚上下班回家都會在線。對文章結(jié)構(gòu)和敘述請大家給予批評并且給出建議(最重要的一點)
文章中可點擊的鏈接都是我自己寫的玉凯。

本章主要包括
1 Collection簡介
????1.1 Collection接口
????1.2 AbstractCollection抽象類
2 List簡介
????2.1 List接口
????2.2 AbstractList抽象類
3 Set簡介
????3.1 Set接口
????3.2 AbstractSet抽象類
4 Iterator
5 后續(xù)

  1. Collection簡介
    首先我們先來看下Collection的類圖


    異常龐大的Collection類圖

    從類圖中就可以看出來Collection在Java中有著舉足輕重的地位势腮。
    將類圖放大到Collection的前幾個層次你就會發(fā)現(xiàn),Collection主要有兩個分支:List和Set漫仆。


    重要分支

    1.1 Collection接口
    Collection是集合的高度抽象捎拯,定義了集合共有的操作
size():int //返回集合中的元素數(shù)量
isEmpty():boolean // 判斷集合是否為空
contains(Object):boolean //判斷集合是否包含此元素
toArray():Object[] //將集合轉(zhuǎn)化為數(shù)組返回
toArray(T[]):T[] //返回指定元素類型的數(shù)組
add(E):boolean //添加元素,返回是否添加成功 E為泛型
remove(Object):boolean //刪除元素盲厌,返回是否刪除成功
containsAll(Colleaction<?>):boolean //是否包含此集合
addAll(Colleaction<? extents E>):boolean //添加集合
removeAll(Colleaction<署照? extents E>):boolean //刪除集合
retainAll(Colleaction<?>):boolean //取集合的交集
clear() //清空集合
/** JDK1.8新增祸泪,以下方法都用default修飾。
  * default模糊了抽象類和接口的關(guān)系建芙。用default修飾的方法可以不重寫
  * 以下方法和特性另開新章節(jié)
  */
spliterator():Spliterator<E> //返回可分割迭代器,并發(fā)使用.
removeIf(Predicate<? super E>):boolean //指定條件刪除
stream():Stream //返回流没隘,相當(dāng)于高級版的迭代器
parallelStream():Stream //可并行操作的流

containsAll和removeAll的誤區(qū)
containsAll和removeAll不是刪除子集。譬如源Collection是1,2,3待刪除的是1,3禁荸。那么刪除后會為2右蒲。


containsAll

removeAll和containsAll類似。
取并集的操作

@Test
    public void testRetainAll() {
        List<Integer> list = Arrays.asList(1, 2, 3);
        List<Integer> retain = Arrays.asList(1, 3);
        list.retainAll(retain);
        list.forEach(System.out::println);
    }

結(jié)果為2
請在評論區(qū)回答這里為什么是錯誤的赶熟。
1.2 AbstractCollection抽象類
AbstractCollection是對Collection的一些公用方法進行實現(xiàn)瑰妄。
同時添加了一個常量

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

此常量是為了限制數(shù)組的長度防止內(nèi)存溢出
containsAll源碼

for (Object e : c)
            if (!contains(e))
                return false;
        return true;

從此出我們可以看出containAll不是判斷子集,而是判斷是否包含參數(shù)集合的所有元素

  1. List
    List繼承Colleaction,中文叫做列表映砖,元素可以重復(fù)间坐,元素排列有序,線程不安全邑退。
    順序不是指排序而是你添加到時候是3,1,2的順序添加眶诈,那么取出來的順序也是3,1,2
    2.1 List接口
    在Collection原有的操作上添加了以下操作
get(int):E //獲取索引位置的元素
set(int,E):E //在此索引位置將元素設(shè)置為E,也即是替換掉
add(int, E):void //在此索引位置上添加元素E
remove(int):E //刪除指定索引位置上的元素并返回此元素
indexOf(Object):int //返回Object在元素上第一次出現(xiàn)的索引位置
lastIndexOf(Object):int //返回Object在元素上最后一次出現(xiàn)的索引位置
listInterator():ListInterator //返回列表迭代器,可以在迭代器中刪除元素
listInterator(int): //返回指定開始位置的迭代器
subList(int form,int end): //返回List的視圖,從From到end的位置  //在ArrayList一章中會解釋瓜饥,文章發(fā)布后會加一個鏈接

2.2 AbstractList抽象類
AbstractList添加了以下操作和一個變量

removeRange(int from,int end):void //刪除from -- end范圍內(nèi)的元素
private rangeCheckForAdd(int):void //判斷添加的索引位置是否合法。不合法則拋出IndexOutBoundsException異常
private outOfBoundsMsg(int):String  //返回異常的信息浴骂,int是非法的索引位置
modCount://變量 記錄修改次數(shù)乓土,當(dāng)modCount不匹配的時候會拋出異常。
當(dāng)然理想很豐滿溯警,在單線程的情況下modCount會及時失效趣苏。但是在多線程的時候由于內(nèi)存不可見性會導(dǎo)致modCount的值不是最新值,因此會導(dǎo)致判斷不準確梯轻。

還有四個內(nèi)部類
Ltr:從左到右的列表迭代器
ListLtr extends Itr Implement ListIterator:可雙向移動的列表迭代器
SubList extends AbstractList:列表試圖
RandomAccessSubList extends SubList:可隨機訪問的列表試圖
3 Set
Set繼承Collection食磕。中文叫做集合,元素不可以重復(fù)喳挑,元素排列是無序彬伦。
無序的含義是插入時的順序和取出的順序不相同,而不是按元素排序伊诵。

        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(3);
        set.add(2);
        set.forEach(System.out::println);

輸出的結(jié)果為1,2,3单绑。自動對元素進行排序。但是不能說它是有序的曹宴。
3.1 Set接口
沒有增加任何操作
3.2 AstractSet抽象類
AbstractSet繼承了AbstractCollection抽象類和Set接口搂橙。沒有增加操作。

  1. Iterator
    Iterator是集合的迭代器笛坦,但是卻有限制只能順序移動区转。
hasNext():boolean //下一個索引位置是否有元素
next():E //返回下一個位置的元素
remove():void //刪除操作苔巨。
/**JDK1.8新增*/
forEachRemaining(Consumer<? super E> action):

remove()源碼

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

Iterator使用了迭代器模式

  1. 后續(xù)
    這篇文章會擴展出:迭代器模式废离,Lambda侄泽,ArrayList,SubList厅缺,ListIterator等文章蔬顾。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市湘捎,隨后出現(xiàn)的幾起案子诀豁,更是在濱河造成了極大的恐慌,老刑警劉巖窥妇,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷胜,死亡現(xiàn)場離奇詭異,居然都是意外死亡活翩,警方通過查閱死者的電腦和手機烹骨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來材泄,“玉大人沮焕,你說我怎么就攤上這事±冢” “怎么了峦树?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旦事。 經(jīng)常有香客問我魁巩,道長,這世上最難降的妖魔是什么姐浮? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任谷遂,我火速辦了婚禮,結(jié)果婚禮上卖鲤,老公的妹妹穿的比我還像新娘肾扰。我一直安慰自己,他們只是感情好蛋逾,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布白对。 她就那樣靜靜地躺著,像睡著了一般换怖。 火紅的嫁衣襯著肌膚如雪甩恼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音条摸,去河邊找鬼悦污。 笑死,一個胖子當(dāng)著我的面吹牛钉蒲,可吹牛的內(nèi)容都是我干的切端。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼顷啼,長吁一口氣:“原來是場噩夢啊……” “哼踏枣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钙蒙,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤茵瀑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后躬厌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體马昨,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年扛施,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸿捧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡疙渣,死狀恐怖匙奴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妄荔,我是刑警寧澤泼菌,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站懦冰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谣沸。R本人自食惡果不足惜刷钢,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乳附。 院中可真熱鬧内地,春花似錦、人聲如沸赋除。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春葵姥,著一層夾襖步出監(jiān)牢的瞬間丧枪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喉悴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓玖媚,卻偏偏與公主長得像箕肃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子今魔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • ??在之前的學(xué)習(xí)中我們將Java的集合框架做了一個大致的分類勺像,對集合的結(jié)構(gòu)有一定的了解,現(xiàn)在便是由表及里错森,我們深入...
    卡農(nóng)Canon閱讀 374評論 0 1
  • 前言:一名iOS開發(fā)工程師,正在學(xué)習(xí)Android開發(fā),期待各路大神指點和學(xué)習(xí)交流.學(xué)習(xí)交流討論及資料獲取請關(guān)注:...
    極客James閱讀 4,380評論 0 5
  • 一吟宦、基礎(chǔ)知識:1、JVM问词、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,371評論 0 4
  • 在經(jīng)過一次沒有準備的面試后督函,發(fā)現(xiàn)自己雖然寫了兩年的android代碼,基礎(chǔ)知識卻忘的差不多了激挪。這是程序員的大忌辰狡,沒...
    猿來如癡閱讀 2,836評論 3 10
  • 所謂生活,就從來不是簡簡單單的垄分。 就如現(xiàn)在宛篇,剛畢業(yè)工作的小年輕,拿的薪水僅僅是剛剛養(yǎng)活自己薄湿,幾乎不剩下什么叫倍。感覺買...
    我是甜不甩閱讀 189評論 0 0