JAVA篇:Java集合框架
我曾做下一週一篇的計劃,然而另一篇章的進行實在很不順利,甚至有一章塗塗改改多次後感覺還是不對勁想要推翻重新寫,所以用Java篇來混更了……
只是很多知識點其實已經有不少大佬已經有比較詳盡、準確的概括了,畢竟自己水平也不怎麼夠,我所做的其實只是在整理以及逐字打下大佬的觀點時整理自己的知識點。
1、java集合整體框架
Java集合框架主要包含兩種型別的容器,一種是集合(Collection),儲存一個元素幾個,另一種是圖(Map),儲存鍵/值對對映。Collection介面又有3種子型別,List、Set和Queue,再下面是一些抽象類,最後是具體實現類,常用的有ArrayList、Linked、List、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。
2、Iterator介面
java.util.Iterator
該介面是Collection物件的迭代器,是遍歷集合的工具。Collection依賴於Iterator,Collection的實現類都要實現iterator()函式返回一個iterator物件,其中的ListIterator是專門為遍歷List而存在的。Iterator取代了Java Collections Framework種的Enumeration。
/* Iterator */ Integer[] arr = {1,2,3,4,5}; List<Integer> list = Arrays.asList(arr); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ System.out.print(iterator.next()+" ");//1 2 3 4 5 } System.out.println(); ListIterator<Integer> literator = list.listIterator(2); while (literator.hasNext()){ System.out.print(literator.next()+" ");//3 4 5 } System.out.println();
3、Collection介面
java.util.Collection
是一個集合框架的父介面,它提供了對集合物件進行基本操作的通用介面方法。Collection介面的重要子介面包括List、Set和Queue,Map並不是Collection的子介面。
4、List介面
java.util.List
列表是有序的collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確的控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。列表通常允許重複的元素。
List介面在iterator、add、remove、equals和hashCode方法的協定上加了一些其他的約定,List介面提供了4種對列表元素進行定位(索引)訪問方法,提供了特殊的迭代器ListIterator(允許元素插入和替換,以及雙向訪問),提供了兩種搜尋指定物件的方法,提供了兩種在列表的任一位置高效插入和溢位多個元素的方法。
具體方法見:
List介面有四個重要的實現類:ArrayList、LinkedList\Vector、Stack。
4.1 ArrayList類
java.util.AbstractList<E>
提供了List介面的骨幹實現,以最大限度地減少實現“隨機訪問”資料儲存(如陣列)支援的該介面 所需的工作。對於連續訪問的資料應優先使用LinkedList而不是此類。
ArrayList是一個動態陣列,也是我們最常用的集合,它允許任何符合規則的元素的插入甚至包括null。每一個ArrayList都有一個初始容量(10),該容量代表了陣列的大小。容器種的元素不斷增加,容器的大小也會隨著增加。在每次向容器種增加元素的同時都會進行容量檢查,當快溢位時,就會進行擴容操作。所以如果我們明確所插入元素的大小,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。
ArrayList擅長於隨機訪問,同時ArrayList是非同步的。
具體方法見:
陣列與ArrayList
陣列在記憶體中是連續的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡單。但是陣列需要一開始就確定長度,並且在兩個資料建插入資料很麻煩,由此引入了Array List。
a)列表轉換成陣列的方法
/* List轉為陣列 */ List<Integer> alist = new ArrayList<Integer>(); alist.add(12); alist.add(13); //List提供了toArray的介面可以直接轉為object型別的陣列 //但是該方法存在強制型別轉換時會丟擲異常 Object[] objects = alist.toArray(); //可以指定型別以及陣列長度 Integer[] a = alist.toArray(new Integer[alist.size()]); System.out.println(a[0]+" "+a[1]);//12 13
b)陣列轉換成列表的方法
/*陣列轉換為list*/ Integer[] arr = {1,2,3,4,5}; //1、該方法存在弊端,返回的list時Arrays裡面的一個靜態內部類,該類未實現add,remove方法,因此在使用時存在侷限性 List<Integer> list1 = Arrays.asList(arr); / list1.remove(1);//java.lang.UnsupportedOperationException System.out.println(list1); //2、可以使用ArrayList的構造方法 List<Integer> list2 = new ArrayList<>(Arrays.asList(arr)); list2.remove(1); System.out.println(list2); //3、運用collections的addAll方法 List<Integer> list3 = new ArrayList<>(arr.length); Collections.addAll(list3,arr); System.out.println(list3);
4.2 LinkedList類
java.util.LinkedList
是List介面的連結列表實現,實現所有可選的列表操作,同時也也實現了Deque介面,為add、poll提供先進先出佇列操作,以及其他堆疊和雙端佇列操作。
LinkedList是一個雙向連結串列,其實現機制與ArrayList完全不同,其隨機訪問集合中的元素效能比較差,但在插入刪除元素時有較好的效能。同時,LinkedList也是非同步的。
具體方法見:
4.3 Vector類
Vector類可以實現可增長的物件陣列,與ArrayList相似,但是Vector時同步的,是執行緒安全的動態陣列,它的操作與ArrayList幾乎一樣。
具體方法見:
4.4 Stack類
java.util.Stack
表示後進先出(LIFO)的物件堆疊,它繼承自Vector。
具體方法見:
5 Set介面
java.util.Set
是一個不包含重複元素的collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。
Set介面有三個具體實現類,分別是雜湊集HashSet、鏈式雜湊集LinkedHashSet和樹形集TreeSet。
5.1 HashSet類
java.util.HasSet
是set集合最常用的實現類,是其經典實現。HashSet是按照hash演算法來儲存元素的,因此具有很好的存取和查詢效能。其具有如下特點:
-
不能保證元素的順序:一是元素插入順序和輸出順序不能保證一致,而元素儲存位置由其雜湊值決定,是固定的。
-
HashSet不是執行緒同步的,如果多執行緒操作HashSet集合,則應通過程式碼來保證其同步。
-
集合元素值可以是null,但僅能有一個null值。
具體方法見:
5.2 LinkedHashSet類
java.util.LinkedHashSet
具有可預知迭代順序的 Set 介面的雜湊表和連結列表實現。此實現與 HashSet 的不同之外在於,後者維護著一個運行於所有條目的雙重連結列表。此連結列表定義了迭代順序,即按照將元素插入到 set 中的順序(插入順序)進行迭代。注意,插入順序不 受在 set 中重新插入的 元素的影響。
LinkedHashSet是HashSet的一個子類,具有HashSet的特性,但是它使用連結串列維護元素的次序,元素的順序與新增順序一致。由於LinkedHashSet需要維護元素的插入順序,因此效能略低於HashSet,但在迭代訪問Set裡的全部元素時有很好的效能。
具體方法見:
5.3 TreeSet類
java.util.TreeSet
是基於TreeMap的NavigableSet的實現,非執行緒安全。使用元素的自然順序,或者根據建立set時提供的Comparator進行排序,具體取決使用的構造方法。
具體方法見:
6 Map介面
Map介面與List、Set介面不同,它是由一系列鍵值對組成的集合,提供了key到value的對映。同時它也沒有繼承Collection,在Map中它保證的key和value之間的一一對應關係。也就是說一個key對應一個value,所以它不能存在相同的key值,當然value值可以相同。
Map介面包含重要的巢狀介面Map.Entry<K,V>,以及三個具體實現類HashMap、LinkedHashMap和TreeMap。
6.1 HashMap
java.util.HashMap
是基於雜湊表的Map介面的實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。除了非同步和允許使用null之外,HashMap類與Hashtable大致相同,此類不保證對映的順序,特別是它不保證該順序恆久不變。
具體方法見:
6.2 LinkedHashMap
java.util.LinkedHashMap
是HashMap的一個子類,它保留插入的順序,如果需要輸出的順序和輸入時的相同,那麼就選用LinkedHashMap。
LinkedHashMap維護著一個運行於所有條目的雙重連結列表,此連結列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。
具體方法見:
6.3 TreeMap
TreeMap 是一個有序的key-value集合,非同步,基於紅黑樹(Red-Black tree)實現,每一個key-value節點作為紅黑樹的一個節點。TreeMap儲存時會進行排序的,會根據key來對key-value鍵值對進行排序,其中排序方式也是分為兩種,一種是自然排序,一種是定製排序,具體取決於使用的構造方法。
-
自然排序:TreeMap中所有的key必須實現Comparable介面,並且所有的key都應該是同一個類的物件,否則會報ClassCastException異常。
-
定製排序:定義TreeMap時,建立一個comparator物件,該物件對所有的treeMap中所有的key值進行排序,採用定製排序的時候不需要TreeMap中所有的key必須實現Comparable介面。
具體方法見:
7 總結
整理得很煩躁……或許是時間安排不對或許是這樣子整理法不對吧。
參考