JAVA中的Collection接口和其主要實現(xiàn)的類

JAVA中的Collection接口和其主要實現(xiàn)的類

Collection是最基本的集合接口蒜焊,一個Collection代表一組Object,即Collection的元素(Elements)科贬。一些Collection允許相同的元素而另一些不行泳梆。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類榜掌,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set,詳細(xì)信息可見官方文檔http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Collection.html,下面我們來討論繼承它的接口list,Set优妙,這兩個接口實現(xiàn)了主要的方法,但是還是有一些拓展的憎账,不如list中的迭代就和collection中的有些不同套硼,下面會詳細(xì)介紹,這里我們用一個例子體會一下這里的接口的實現(xiàn):

 Collection<Integer> list=new LinkedList<>();  

list

  • list是有序的 collection(也稱為序列)胞皱。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制邪意。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素反砌。
  • listSet不同雾鬼,list允許重復(fù)的元素插入
  • list接口提供了兩種在列表的任意位置高效插入和移除多個元素的方法。
  • 下面我們來具體介紹一下它的實現(xiàn)的類

LinkedList

從文檔中可以看到這個listedList實現(xiàn)的不只是list接口宴树,比如還是實現(xiàn)了Deque接口策菜,這個為 add、poll 提供先進先出隊列操作森渐,以及其他堆棧和雙端隊列操作做入。這里的LinkedList都是用雙向鏈表實現(xiàn)的,這個類不是同步的同衣,因此在多個線程中有修改其中的元素操作時必須實現(xiàn)外部的線程同步

構(gòu)造方法

  • LinkedList() 創(chuàng)建一個空的鏈表
  • LinkedList(Collection<? extends E> c) 構(gòu)造一個包含指定 collection 中的元素的列表梯码,這些元素按其 collection 的迭代器返回的順序排列,構(gòu)造如下:
        ArrayList<Integer> arrayList=new ArrayList<>();  //這里新建一個線性列表
        LinkedList<Integer> linkedList=new LinkedList<Integer>(arrayList);  //用線性列表新建一個鏈表
        System.out.println(linkedList.getFirst());      

方法摘要

  • boolean add(E e) 將指定元素添加到此列表的結(jié)尾。成功插入返回True
  • void add(int index, E element) 在此列表中指定的位置插入指定的元素凌摄。
  • boolean addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的結(jié)尾,順序是指定 collection 的迭代器返回這些元素的順序蒋情。例子如下:
 ArrayList arrayList=new ArrayList();//新建一個線性表
        arrayList.add(10);
        arrayList.add(100);
        arrayList.add(2);
        LinkedList linkedList=new LinkedList();
        linkedList.add(100);
        linkedList.add("chenjiabing");

        linkedList.addAll(arrayList);  //將線性表中所有的元素添加到鏈表中
        for(Object i:linkedList)
        {
            System.out.println(i);
        }

  • boolean addAll(int index, Collection<? extends E> c) 將指定 collection 中的所有元素從指定位置開始插入此列表。
  • addFirst 將指定的元素添加到開頭
  • addLast 將指定的元素添加到末尾
  • clear() 從列表中移除全部的元素
  • clone() 得到一個鏈表的副本耸携,由于其返回的類型是Object棵癣,因此需要進行強制轉(zhuǎn)換成LinkedList類型
 LinkedList list=(LinkedList)linkedList.clone();
  • contains(Object o) 如果此列表中包含元素o返回True
  • element() 獲取但不移除此列表的頭(第一個元素)。
  • iterator() 返回列表中的元素的迭代器
Iterator iter=list.iterator();      //返回一個迭代器類型
while(iter.hasNext())     //判斷迭代器中是否存在元素
{
    Object o=iter.next();    
    if(o.equals(1))
    {
    System.out.println(o);   //輸出迭代器中的元素
    iter.remove();   //移除這個元素夺衍,這個是從列表中直接移除的
}
    
}
  • listIterator() 返回此列表中的元素的列表迭代器(按適當(dāng)順序)狈谊,從列表中指定位置開始
ListIterator iterator = list.listIterator();
        while (iterator.hasNext())     //首先將迭代器一直運行到末尾
        {
            Object o = iterator.next();
            if (o.equals(1)) {
                iterator.add(100);   //將元素插入到當(dāng)前元素的前面,這個在Iterator是不存在的方法
            }

        }

        while (iterator.hasPrevious())   //這時的迭代器是從末尾開始的沟沙,因此這里相當(dāng)與逆序輸出
        {
            System.out.println(iterator.previous());
        }
  • get(int index) 返回此列表中指定位置處的元素河劝。這里要注意的是雖然這種方式能夠得到指定索引的值,但是這里對于鏈表中的操作開銷是非常大的矛紫,因此這個方法不主張使用赎瞎,如果需要遍歷列表可以使用迭代器和for-each語句
LinkedList list=new LinkedList();
for(int i=0;i<10;i++)
{
    list.add(i);
}
for(Object o:list){     //使用for-each遍歷列表
System.out.println(o); 
}

Iterator iter=list.iterator();      //返回一個迭代器類型

while(iter.hasNext())     //判斷迭代器中是否存在元素
{
    System.out.println(iter.next());   //輸出迭代器中的元素
}

  • getFirst() 返回此列表的第一個元素。
  • getLast() 返回此列表的最后一個元素
  • indexOf(Object o) 返回元素第一次出現(xiàn)的索引
  • lastIndexOf(Object o) 返回元素最后一次出現(xiàn)的索引
  • toArray() 返回以適當(dāng)順序(從第一個元素到最后一個元素)包含此列表中所有元素的數(shù)組
  • set(index,element) 將指定索引的元素替換成element
  • size() 返回元素的個數(shù)
  • remove() 移除表頭的元素
  • remove(index) 移除此列表中指定位置處的元素颊咬。

ArrayList

  • List 接口的大小可變數(shù)組的實現(xiàn)务甥。實現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素喳篇。除了實現(xiàn) List 接口外敞临,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小。(此類大致上等同于 Vector 類杭隙,除了此類是不同步的哟绊。)
  • 每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數(shù)組的大小痰憎。它總是至少等于列表的大小票髓。隨著向 ArrayList 中不斷添加元素,其容量也自動增長铣耘。并未指定增長策略的細(xì)節(jié)洽沟,因為這不只是添加元素會帶來分?jǐn)偣潭〞r間開銷那樣簡單。
  • 注意蜗细,此實現(xiàn)不是同步的裆操。如果多個線程同時訪問一個 ArrayList 實例,而其中至少一個線程從結(jié)構(gòu)上修改了列表炉媒,那么它必須 保持外部同步踪区。(結(jié)構(gòu)上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調(diào)整底層數(shù)組的大械踔琛缎岗;僅僅設(shè)置元素的值不是結(jié)構(gòu)上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成白粉。如果不存在這樣的對象传泊,則應(yīng)該使用 Collections.synchronizedList 方法將該列表“包裝”起來

構(gòu)造函數(shù)

  • ArrayList() 構(gòu)造一個初始容量為 10 的空列表鼠渺。
  • ArrayList(Collection<? extends E> c) 構(gòu)造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的眷细。
  • 構(gòu)造一個具有指定初始容量的空列表拦盹。

方法摘要

由于和LinkedList繼承了同一個接口,因此大部分的函數(shù)都是相同的溪椎,只是在拓展了一些特有的方法普舆,共有的方法有:add,addAll,get,clone,clear,contains,indexOf,remove,set,size,toArray,lastIndexOf,iterator,listIterator。特有的方法如下:

  • isEmpty() 如果此列表中沒有元素校读,則返回 true
  • void trimToSize() 將此 ArrayList 實例的容量調(diào)整為列表的當(dāng)前大小奔害。因為這里的線性列表的容量會隨著加入的元素而增加,因此這個函數(shù)的作用就是將線性列表的的容量變成當(dāng)成元素的大小

Vector

  • Vector類可以實現(xiàn)可增長的對象數(shù)組地熄。與數(shù)組一樣,它包含可以使用整數(shù)索引進行訪問的組件芯杀。但是端考,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進行添加或移除項的操作
  • 每個向量會試圖通過維護 capacity 和 capacityIncrement 來優(yōu)化存儲管理揭厚。capacity 始終至少應(yīng)與向量的大小相等却特;這個值通常比后者大些,因為隨著將組件添加到向量中筛圆,其存儲將按 capacityIncrement 的大小增加存儲塊裂明。應(yīng)用程序可以在插入大量組件前增加向量的容量;這樣就減少了增加的重分配的量太援。
  • 從源碼中可以看出Vector是線程安全的闽晦,源碼中的插入和刪除操作都實現(xiàn)了進程的同步語句塊,因此Vector的插入和刪除是比較低效的

構(gòu)造函數(shù)

  • Vector() 構(gòu)造一個空向量提岔,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10仙蛉,其標(biāo)準(zhǔn)容量增量為零。
  • Vector(Collection<? extends E> c) 構(gòu)造一個包含指定 collection 中的元素的向量碱蒙,這些元素按其 collection 的迭代器返回元素的順序排列荠瘪。
  • Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量構(gòu)造一個空向量。
  • Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量構(gòu)造一個空的向量赛惩。

注意:使用第一種方法系統(tǒng)會自動對向量進行管理哀墓,若使用后兩種方法。則系統(tǒng)將根據(jù)參數(shù)喷兼,initialcapacity設(shè)定向量對象的容量(即向量對象可存儲數(shù)據(jù)的大欣捍隆),當(dāng)真正存放的數(shù)據(jù)個數(shù)超過容量時褒搔。系統(tǒng)會擴充向量對象存儲容量.

方法摘要

同樣是繼承了List接口阶牍,因此大部分的方法都是一樣的喷面,比如add,addAll,clear,clone,contains,remove,removeall

stack

Stack 類表示后進先出(LIFO)的對象堆棧。它通過五個操作對類 Vector 進行了擴展 走孽,允許將向量視為堆棧惧辈。它提供了通常的 push 和 pop 操作,以及取堆棧頂點的 peek 方法磕瓷、測試堆棧是否為空的 empty 方法盒齿、在堆棧中查找項并確定到堆棧頂距離的 search 方法。
注意:這里的stack雖然繼承了了Iterator接口但是如果使用了迭代的話它輸出的還是原來你輸入的順序困食,這里就違背了棧的原理后進先出

構(gòu)造方法

  • Stack() 創(chuàng)建一個空堆棧边翁。

方法摘要

  • isEmpty() 測試堆棧是否為空。
  • peek() 查看堆棧頂部的對象硕盹,但不從堆棧中移除它符匾。
  • pop() 移除堆棧頂部的對象,并作為此函數(shù)的值返回該對象瘩例。
  • push(E element) 把項壓入堆棧頂部啊胶。
  • search(Object o) 返回對象在堆棧中的位置,以 1 為基數(shù)垛贤。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焰坪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聘惦,更是在濱河造成了極大的恐慌某饰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件善绎,死亡現(xiàn)場離奇詭異黔漂,居然都是意外死亡,警方通過查閱死者的電腦和手機禀酱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門瘟仿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人比勉,你說我怎么就攤上這事劳较。” “怎么了浩聋?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵观蜗,是天一觀的道長。 經(jīng)常有香客問我衣洁,道長墓捻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮砖第,結(jié)果婚禮上撤卢,老公的妹妹穿的比我還像新娘。我一直安慰自己梧兼,他們只是感情好放吩,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羽杰,像睡著了一般渡紫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上考赛,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天惕澎,我揣著相機與錄音,去河邊找鬼颜骤。 笑死唧喉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忍抽。 我是一名探鬼主播欣喧,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梯找!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起益涧,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤锈锤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闲询,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體久免,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年扭弧,在試婚紗的時候發(fā)現(xiàn)自己被綠了阎姥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸽捻,死狀恐怖呼巴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情御蒲,我是刑警寧澤衣赶,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站厚满,受9級特大地震影響府瞄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碘箍,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一遵馆、第九天 我趴在偏房一處隱蔽的房頂上張望鲸郊。 院中可真熱鬧,春花似錦货邓、人聲如沸秆撮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽像吻。三九已至,卻和暖如春复隆,著一層夾襖步出監(jiān)牢的瞬間拨匆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工挽拂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惭每,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓亏栈,卻偏偏與公主長得像台腥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绒北,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評論 0 1
  • 集合類簡介 為什么出現(xiàn)集合類?面向?qū)ο笳Z言對事物的體現(xiàn)都是以對象的形式脐往,所以為了方便對多個對象的操作休吠,就要對對象進...
    阿敏其人閱讀 1,417評論 0 7
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法业簿,內(nèi)部類的語法瘤礁,繼承相關(guān)的語法,異常的語法梅尤,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 學(xué)校禮堂到操場982步 操場到女生宿舍3號樓1133步 二部食堂到北大門口1044步 圖書館到女生宿舍3號樓102...
    現(xiàn)實說閱讀 619評論 0 0
  • 你認(rèn)識蠟筆小新嗎巷燥? 認(rèn)識啊酝蜒,天天脫光光躺在地板上那個嘛。 那你知道蠟筆小新的媽媽叫什么嗎矾湃? 蠟筆媽媽...
    大肚南瓜閱讀 158評論 0 0