JAVA中的Collection接口和其主要實現的類

JAVA中的Collection接口和其主要實現的類

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

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

list

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

LinkedList

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

構造方法

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

方法摘要

  • boolean add(E e) 將指定元素添加到此列表的結尾。成功插入返回True
  • void add(int index, E element) 在此列表中指定的位置插入指定的元素。
  • boolean addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的結尾,順序是指定 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,因此需要進行強制轉換成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() 返回此列表中的元素的列表迭代器(按適當順序),從列表中指定位置開始
ListIterator iterator = list.listIterator();
        while (iterator.hasNext())     //首先將迭代器一直運行到末尾
        {
            Object o = iterator.next();
            if (o.equals(1)) {
                iterator.add(100);   //將元素插入到當前元素的前面,這個在Iterator是不存在的方法
            }

        }

        while (iterator.hasPrevious())   //這時的迭代器是從末尾開始的,因此這里相當與逆序輸出
        {
            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) 返回元素第一次出現的索引
  • lastIndexOf(Object o) 返回元素最后一次出現的索引
  • toArray() 返回以適當順序(從第一個元素到最后一個元素)包含此列表中所有元素的數組
  • set(index,element) 將指定索引的元素替換成element
  • size() 返回元素的個數
  • remove() 移除表頭的元素
  • remove(index) 移除此列表中指定位置處的元素。

ArrayList

  • List 接口的大小可變數組的實現。實現了所有可選列表操作,并允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。(此類大致上等同于 Vector 類,除了此類是不同步的。)
  • 每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數組的大小。它總是至少等于列表的大小。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。并未指定增長策略的細節,因為這不只是添加元素會帶來分攤固定時間開銷那樣簡單。
  • 注意,此實現不是同步的。如果多個線程同時訪問一個 ArrayList 實例,而其中至少一個線程從結構上修改了列表,那么它必須 保持外部同步。(結構上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調整底層數組的大小;僅僅設置元素的值不是結構上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用 Collections.synchronizedList 方法將該列表“包裝”起來

構造函數

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

方法摘要

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

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

Vector

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

構造函數

  • Vector() 構造一個空向量,使其內部數據數組的大小為 10,其標準容量增量為零。
  • Vector(Collection<? extends E> c) 構造一個包含指定 collection 中的元素的向量,這些元素按其 collection 的迭代器返回元素的順序排列。
  • Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量構造一個空向量。
  • Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量構造一個空的向量。

注意:使用第一種方法系統會自動對向量進行管理,若使用后兩種方法。則系統將根據參數,initialcapacity設定向量對象的容量(即向量對象可存儲數據的大小),當真正存放的數據個數超過容量時。系統會擴充向量對象存儲容量.

方法摘要

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

stack

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

構造方法

  • Stack() 創建一個空堆棧。

方法摘要

  • isEmpty() 測試堆棧是否為空。
  • peek() 查看堆棧頂部的對象,但不從堆棧中移除它。
  • pop() 移除堆棧頂部的對象,并作為此函數的值返回該對象。
  • push(E element) 把項壓入堆棧頂部。
  • search(Object o) 返回對象在堆棧中的位置,以 1 為基數。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 891評論 0 1
  • 集合類簡介 為什么出現集合類?面向對象語言對事物的體現都是以對象的形式,所以為了方便對多個對象的操作,就要對對象進...
    阿敏其人閱讀 1,439評論 0 7
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,738評論 18 399
  • 學校禮堂到操場982步 操場到女生宿舍3號樓1133步 二部食堂到北大門口1044步 圖書館到女生宿舍3號樓102...
    現實說閱讀 635評論 0 0
  • 你認識蠟筆小新嗎? 認識啊,天天脫光光躺在地板上那個嘛。 那你知道蠟筆小新的媽媽叫什么嗎? 蠟筆媽媽...
    大肚南瓜閱讀 222評論 0 0