1. 程式人生 > >JAVA SE學習筆記(九)Java集合

JAVA SE學習筆記(九)Java集合

1 Java集合框架

1.1 概述

  Java提供集合類的目的是——為了儲存數量不確定的資料,以及儲存具有對映關係的資料,集合類也被稱為是容器類,處於java.util包下。集合類和陣列的區別:陣列元素可以是基本型別的值,也可以是物件,而集合裡只能儲存物件。Java的集合類主要是有兩個介面派生而出:CollectionMap

圖1-1 Collection集合體系的繼承樹

Collection
圖1-2 Map體系的繼承樹

Map
  • Java集合分為:SetListQueueMap
    • Set代表無序、不可重複的集合
    • List代表有序、重複的集合
    • Queue佇列集合
    • Map代表具有對映關係的集合,鍵值不可以重複
  • 訪問方式:List按索引、Mapkey訪問valueSet使用元素本身訪問

1.2 Collection和Iterator介面

1.2.1 Collection介面

  Collection介面是ListSetQueue介面的父介面,該接口裡定義的方法既可用與操作Set集合,也可用於操作ListQueue集合

  • Collection介面定義的方法:
    • boolean add(Object o):用於向集合裡新增一個元素
    • boolean addAll(Collection c):用於將集合c裡的所有元素新增到指定集合裡
    • void clear():清除集合裡的所有元素
    • boolean contains(Object o):返回集合裡是否包含指定元素
    • boolean containsAll(Collection c):返回集合裡是否包含集合c裡的所有元素
    • boolean isEmpty():返回集合是否為空
    • Iterator iterator():返回一個Iterator物件,用於遍歷集合裡的元素
    • boolean remove(Object o):刪除集合中的指定元素o,當集合中包含了一個或多個元素o時,該方法只刪除第一個符合條件的元素
    • boolean removeAll(Collection c):從集合中刪除集合c中的所有的元素,如果刪除了一個或多個元素,則返回true
    • boolean retainAll(Collection c):從集合中刪除集合c裡不包含的元素,如果操作刪除了一個或一個以上的元素,則返回true
    • int size():返回集合中元素的個數
    • Object[] toArray():把集合轉為一個數組

1.2.2 Iterator介面

  Iterator物件主要是用於遍歷Collection集合中的元素,Iterator物件也被稱為迭代器

  • Iterator介面提供的方法:
    • boolean hasNext():如果被迭代的集合元素還沒有被遍歷完,則返回true
    • Object next():返回集合裡的下一個元素
    • void remove():刪除集合裡上一次next方法返回的元素
    • void forEachRemaining(Consumer action):使用Lambda方法來遍歷集合元素
  • 注意:當使用Iterator對集合元素進行迭代時,Iterator並不是把集合元素本身傳給了迭代變數,而是把集合元素的值傳給了迭代變數,所以修改迭代變數的值對集合元素本身沒有任何影響。Iterator迭代器使用的是快速失敗(fail-fast)機制,一旦在迭代過程中檢測到該集合已經被修改,程式立即引發ConcurrentModificationException異常,而不是顯示修改後的結果,這樣可以避免共享資源而引發的潛在問題。

1.2.3 遍歷Collection

  • 使用Lambda表示式遍歷集合元素
public static void main(String[] args)throws Exception {
    Collection books = new HashSet();
    books.add("機器學習");
    books.add("統計學習方法");
    books.add("社群發現");
    books.add("大資料時代");
    // Methods inherited from interface java.lang.Iterable
    books.forEach(obj -> System.out.println(obj));
}
  • 使用Iterator遍歷集合元素
public static void main(String[] args)throws Exception {
    Collection books = new HashSet();
    books.add("機器學習");
    books.add("統計學習方法");
    books.add("社群發現");
    books.add("大資料時代");
    Iterator it = books.iterator();
    while(it.hasNext()){
          System.out.println(it.next());
    }
}
  • 使用Lambda表示式遍歷Iterator來遍歷集合元素
public static void main(String[] args)throws Exception {
    Collection books = new HashSet();
    books.add("機器學習");
    books.add("統計學習方法");
    books.add("社群發現");
    books.add("大資料時代");
    Iterator it = books.iterator();
    it.forEachRemaining(obj -> System.out.println(obj));
}
  • 使用foreach迴圈遍歷集合元素
public static void main(String[] args)throws Exception {
    Collection books = new HashSet();
    books.add("機器學習");
    books.add("統計學習方法");
    books.add("社群發現");
    books.add("大資料時代");
    for(Object obj : books){
        System.out.println(obj);
    }
}

2 具體的集合

2.1 連結串列(List)

  • 在Java中,所有連結串列實際上都是雙向連結的,每個結點存放著指向前驅和後繼結點的引用
  • 連結串列是一個有序集合

2.1.1 List介面

  • List介面提供的方法:
    • void add(int index, Object element):將元素element插入到List集合的index處
    • boolean addAll(int index, Collection c):將集合c所包含的所有元素都插入到List集合的index處
    • Object get(int index):返回集合index索引處的元素
    • int indexOf(Object o):返回物件o在List集合中第一次出現位置的索引
    • int lastIndexOf(Object o):返回物件o在List集合中最後一次出現位置的索引
    • Object remove(int index):刪除並返回index索引處的元素
    • Object set(int index, Object element):將index處的元素替換成element物件,返回被替換的舊元素
    • List subList(int fromIndex, int toIndex):返回從索引fromIndex(包含)到索引toIndex(不包含)處所有集合元素組成的子集合
    • void replaceAll(UnaryOperator operator):根據operator指定的計算規則重新設定List集合的所有元素
    • void sort(Comparator c):根據Comparator引數對List集合的元素排序。

2.1.2 ListIterator介面

  • ListIterator介面提供的方法:
    • boolean hasPrevious():返回該迭代器關聯的集合是否還有上一個元素
    • Object previous():返回該迭代器的上一個元素
    • void add(Object o):在當前位置插入一個元素

2.1.3 ArrayList和Vector實現類

  • List的兩個典型實現:ArrayListVector,基於陣列實現,通常情況下無須考慮ArrayListVectorinitialCapacity,但是在大批量資料操作時,可以使用ensureCapacity(int minCapacity)方法一次性地增加initialCapacity,減少分配次數,提高效能,預設長度為10
  • 兩個和長度相關的函式:
    • void ensureCapacity(int minCapacity):將ArrayListVector集合的Object[]陣列長度增加大於或等於minCapacity
    • void trimToSize():調整ArrayListVector集合的Object[]陣列長度為當前元素的個數,呼叫該方法可減少ArrayListVector集合物件佔用的儲存空間。
  • ArrayList是執行緒不安全的,Vector是執行緒安全的,但是Vector的效能較差,不推薦使用
  • Vector提供一個子類:Stack,進出棧的元素都是Object,必須進行型別轉換,推薦使用ArrayDeque`
    • Object peek():返回棧的第一個元素
    • Object pop():返回棧的第一個元素,並出棧

2.1.4 固定長度的List

  • Arrays工具類提供了一個asList(Object... a)方法,該方法可以把一個數組或指定個數的物件轉換成一個List集合,這個集合是一個Arrays內部類ArrayList的例項,Arrays.ArrayList是一個固定長度的List集合,程式只能遍歷訪問該集合裡的元素,不可增加、刪除該集合裡的元素

2.1.5 各種線性表的效能分析

  1. LinkedList集合不僅提供了List的功能,還提供了雙端佇列、棧的功能;
  2. 綜合性能ArrayList優於LinkedList,在查詢方面ArrayList優於LinkedList,在插入、刪除方面LinkedList優於ArrayList;
  3. 遍歷集合元素:ArrayLis和Vector推薦使用隨機訪問方法(get),LinkedList推薦使用迭代器遍歷
  4. 執行插入、刪除操作:推薦使用LinkedList
  5. 執行緒安全型:使用Collections將集合包裝成執行緒安全的集合。

2.3 集合(Set)

2.3.1 HashSet類

  • HashSet是最常用的Set集合,HashSet按Hash演算法來儲存集合中的元素,因此具有很好的存取和查詢效能,HashSet的特點:
    • 不能保證元素的排列順序;
    • HashSet不是同步的,不是執行緒安全的;
    • 集合元素值可以是null。
  • HashSet的儲存過程:當向HashSet中存入一個元素的時候,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode()值,然後根據該HashCode()值決定該物件在HashSet中的儲存位置。如果有兩個元素通過equals()方法比較返回true,但他們的hashCode()方法返回值不相等,HashSet將會把他們儲存在不同的位置,依然可以新增成功。也就是說HashSet集合判斷兩個元素相等的標準是兩個物件通過equals()方法比較相等,並且兩個物件的hashCode()返回的值也相等。

2.3.2 LinkedHashSet類

  • LinkedHashSet也是根據元素的hashCode值來決定元素的儲存位置,但它同時使用連結串列維護元素的次序,也就是說,當遍歷LinkedHashSet的時候,LinkedHashSet將會按照元素的新增順序來訪問集合裡的元素。LinkedHashSet的效能低於HashSet,但在迭代訪問Set裡的全部元素時將有很好的效能。

2.3.3 TreeSet類

  • TreeSet是SortedSet介面的實現類,可以確保集合元素處於排序狀態,TreeSet特有的方法:
    • Comparator comparator():如果TreeSet採用了訂製排序,則該方法返回定製排序所使用的Comparator,如果TreeSet採用的是自然排序,則返回null
    • Object first():返回集合中的第一個元素
    • Object last():返回集合中的最後一個元素
    • Object lower(Object e):返回集合中位於指定元素之前的元素
    • Object higer(Object e):返回集合中位於指定元素之後的元素
    • SortedSet subset(Object fromElement, Object toElement):返回此Set的子集,範圍從fromElement(包含)到toElement(不包含)
    • SortedSet headset(Object toElement):返回此Set的子集,由小於toElement的元素組成
    • SortedSet tailSet(Object fromElement):返回此Set的子集,由大於或等於fromElement的元素組成
  • TreeSet採用紅黑樹的資料結構來儲存集合元素,TreeSet支援兩種排序方法:自然排序和訂製排序,預設選擇自然排序。
    • 自然排序:升序
    • 定製排序:通過Comparator物件或Lambda表示式實現TreeSet的定製排序,不可以在其中新增不同型別的物件。
  • Comparable介面:compareTo(Object o)方法,實現大小比較,當為0的時候,表示兩個物件相等,當為正整數的時候,表示前面的大,當為負整數的時候,表示後面的大。實現了Comparable介面的類:
    • BigDecimal、BigInteger等數值包裝類:按數值大小比較
    • Character:按Unicode值比較
    • Boolean:true大於false
    • String:按Unicode值比較
    • Date、Time:後面的時間大於前面的時間
  • 向TreeSet集合中新增元素時,只有第一個元素無須實現Comparable介面,後面新增的所有元素都必須實現Comparable介面。

2.3.4 EnumSet類

  • EnumSet是一個專為列舉類設計的集合類,其中的所有元素都必須是指定列舉型別的列舉值,該列舉型別在建立EnumSet時顯式或隱式地指定,且其中的集合元素也是有序的,同列舉類中的順序。EnumSet在內部以位向量的形式儲存,不允許新增null元素。
  • EnumSet提供的類方法:
    • EnumSet allOf(Class elementType):建立一個包含指定列舉類裡所有列舉值的EnumSet集合
    • EnumSet complementOf(EnumSet s):建立一個其元素型別與指定EnumSet裡元素型別相同的EnumSet集合,新EnumSet集合包含原EnumSet集合所不包含的、此列舉類剩下的列舉值
    • EnumSet copyOf(Collection c):使用一個普通集合來建立EnumSet集合
    • EnumSet copyOf(EnumSet s):建立一個與指定EnumSet具有相同元素型別、相同集合元素的EnumSet集合
    • EnumSet noneOf(Class elementType):建立一個元素型別為指定列舉型別的空EnumSet
    • EnumSet of(E first, E… rest):建立一個包含一個或多個列舉值的EnumSet集合,傳入的多個列舉值必須屬於同一個列舉類
    • EnumSet range(E from, E to):建立一個包含從from列舉值到to列舉值範圍內所有列舉值型別的EnumSet集合

2.3.5 各Set實現類的效能分析

  1. 常用的是HashSet和TreeSet,但是HashSet的效能總是好於TreeSet,只有需要維護順序的時候,才考慮使用TreeSet,否則都應該使用HasSet;
  2. LinkedHashSet和HashSet的對比:LinkedHashSet在遍歷查詢方面快,HashSet在插入刪除方面表現出色;
  3. EnumSet是所有集合中效能最好的,但是缺點是隻能包含同一個列舉類中的列舉值作為集合元素。
  4. HashSet、TreeSet、EnumSet都是執行緒不安全的。

2.4 佇列(Queue)

佇列:可以讓人們有效地在尾部新增一個元素,在頭部刪除一個元素

2.4.1 Queue集合

  • Queue介面提供的方法:
    • void add(Object e):將指定元素加入此佇列的尾部
    • Object element():獲取佇列頭部的元素,但是不刪除該元素
    • boolean offer(Object e):將指定元素加入此佇列的尾部,當使用容量有限的佇列時,效果優於add
    • Object peek():獲取佇列頭部元素,單數不刪除該元素,如果佇列為空,則返回null
    • Object poll():獲取佇列頭部的元素,並刪除該元素,如果佇列為空,則返回null
    • Object remove():獲取佇列頭部的元素,並刪除該元素

2.4.2 PriorityQueue實現類

  • PriorityQueue中的元素可以按照任意的順序插入,卻總是按照排序的順序進行檢索
  • 優先順序佇列使用了一個優雅且高效的資料結構——堆

2.4.3 Deque介面和ArrayDeque實現類

  • Deque介面是Queue介面的子介面,代表一個雙端佇列,Deque介面提供的方法:
    • void addFirst(Object e):將指定元素插入該雙端佇列的開頭
    • void addLast(Object e) :將指定元素插入該雙端佇列的末尾
    • Iterator descendingIterator():返回該雙端佇列對應的迭代器,該迭代器將以逆向順序來迭代佇列中的元素
    • Object getFirst():獲取但不刪除雙端佇列的第一個元素
    • Object getLast():獲取但不刪除雙端佇列的最後一個元素
    • boolean offerFirst(Object e):將指定元素插入該雙端佇列的開頭
    • boolean offerLast(Object e) :將指定元素插入該雙端佇列的末尾
    • Object peekFirst():獲取但不刪除雙端佇列的第一個元素,如佇列為空,返回null
    • Object peekLast():獲取但不刪除雙端佇列的最後一個元素,如佇列為空,返回null
    • Object poolFirst():獲取且刪除雙端佇列的第一個元素,如佇列為空,返回null
    • Object poolLast():獲取且刪除雙端佇列的最後一個元素,如佇列為空,返回null
    • Object pop():pop出該雙端佇列所表示的棧的棧頂元素
    • void push(Object e):將一個元素push進該雙端佇列所表示的棧的棧頂
    • Object removeFirst():獲取並刪除該雙端佇列的第一個元素
    • boolean removeFirstOccurrence(Object o):刪除該雙端佇列的第一次出現的元素o
    • Object removeLast():獲取並刪除該雙端佇列的最後一個元素
表2-1 Deque的方法與Queue的方法對照表
Queue的方法 Deque的方法
add(e)/offer(e) addLast(e)/offerLast(e)
remove()/poll() removeFirst()/pollFirst()
element()/peek() getFirst()/peekFirst()
表2-2 Deque的方法與Stack的方法對照表
Stack的方法 Deque的方法
push(e) addFirst(e)/offerFirst(e)
pop() removeFirst()/pollFirst()
peek() getFirst()/peekFirst()

- Deque介面提供了一個典型的實現類:ArrayDeque,可以用作“棧”“隊”

3 對映

對映用來存放鍵值對。

3.1 基本對映操作

  • Java類庫為對映提供了兩個通用的實現:HashMap和TreeMap,這兩個類都實現了Map介面。HashMap對鍵進行雜湊,TreeMap用鍵的整體順序對元素進行排序,並將其組織成搜尋樹,雜湊或比較函式只能作用於鍵,與鍵關聯的值不能進行雜湊或比較。
  • Map介面定義的方法:
    • void clear():刪除該Map物件中的所有key-value對
    • boolean containsKey(Object key):查詢Map中是否包含指定的key,如果包含則返回true
    • boolean containsValue(Object value):查詢Map中是否包含一個或多個value,如果包含則返回true
    • Set entrySet():返回Map中包含的key-value對所組成的Set集合,每個集合元素都是Map.Entry物件
    • Object get(Object key):返回指定key所對應的value,如果此Map中不包含該key,則返回null
    • boolean isEmpty():查詢該Map是否為空,如果為空則返回true
    • Set keyset():返回該Map中所有key組成的Set集合
    • Object put(Object key, Object value):新增一個key-value對
    • void putAll(Map m):將指定Map中的key-value對複製到本Map中
    • Object remove(Object key):刪除指定key所對應的key-value對,返回被刪除key所關聯的value,如果該key不存在,則返回null
    • boolean remove(Object key, Object value):刪除指定鍵值對
    • int size():返回Map中key-value對的個數
    • Collection value():返回該Map裡所有value組成的Collection
  • Map.Entry類包含的方法:
    • Object getKey():返回該Entry裡包含的key值
    • Object getValue():返回該Entry裡包含的value值
    • Object setValue(V value):設定該Entry裡包含的value值,並返回新設定的value值
  • Java 8 為Map新增的方法:
    • Object compute(Object key, BiFunction remappingFunction):該方法使用remappingFunction根據原key-value對計算一個新value。只要新value不為null,就是用新value覆蓋原value;如果原value不為null,但新value為null,則刪除原key-value對;如果原value、新value同時為null,則該方法不改變任何key-value對,直接返回null
    • Object computeAbsent(Object key, Function mappingFunction):如果傳給該方法的key引數在Map中對應的value為null,則使用mappingFunction根據key計算一個新的結果,如果計算結果不為null,則用計算結果覆蓋原有的value。如果原Map原來不包括該key,那麼該方法可能會新增一組key-value對。
    • Object computeIfPresent(Object key, BiFunction remappingFunction):如果傳給該方法的key引數在Map中對應的value不為null,則使用mappingFunction根據key、value計算一個新的結果,如果計算結果不為null,則用計算結果覆蓋原有的value。如果計算結果為null,則刪除原key-value對。
    • void forEach(BiConsumer action):遍歷方法
    • Object getOrDefault(Object key, V defaultValue):獲取指定key對應的value,如果該key不存在,則返回defaultVaule
    • Object merge(Object key, Object key, BiFunction remappingFunction):該方法會先根據key引數獲取該Map中對應的vaule,如果獲取的value為null,則直接用傳入的value覆蓋原有的value;如果獲取的value不為null,則使用remappingFunction函式根據原value、新value計算一個新的結果,並用得到的結果去覆蓋原有的value
    • Object putIfAbsent(Object key, Object value):該方法會自動檢測指定key對應的value是否為null,如果該key對應的value為null,該方法將會用新value代替原來的null值
    • Object replace(Object key, Object value):將Map中指定key對應的value替換成新value。與傳統put()方法不同的是,該方法不可能新增新的key-value對。如果嘗試替換的key在原Map中不存在,該方法不會新增key-value對,而是返回null。
    • boolean replaceAll(K key, V oldValue, V newValue):將Map中指定key-value對的原value替換成新value。如果在Map中找到指定的key-value對,則執行替換並返回true,否則返回false。
    • replaceAll(BiFunction function):該方法使用BiFunction對原key-value對執行計算,並將計算結果作為該key-value對的value值

3.2 Java 8 改進的HashMap和Hashtable方法

  • HashMap和Hashtable的區別:
    • Hashtable是一個執行緒安全的Map實現,但HashMap是執行緒不安全的實現。因此HashMap的效能要優於Hashtable
    • Hashtable不允許使用null作為key和value,但是HashMap可以

3.3 LinkedHashMap實現類

  • LibkedHashMap使用雙向連結串列來維護key-value對的次序,該列表負責維護Map的迭代順序,迭代順序與key-value對的插入順序保持一致;
  • 效能低於HashMap

3.4 使用Properties讀寫屬性檔案

  • Properties類可以把Map物件和屬性檔案關聯起來,從而可以把Map物件中的key-value對寫入屬性檔案中,也可以把屬性檔案中的“屬性名=屬性值”載入到Map物件中,Properties裡的key、value都是字串物件
  • 方法:
    • String getProperty(String key):獲取Properties中指定屬性名對應的屬性值
    • String getProperty(String key, String defaultValue):同上一個函式的功能,就是在key不存在的時候返回預設值
    • Object setProperty(String key, String value):設定屬性值
    • void load(InputStream inStream):從屬性檔案中載入key-value對,把載入到的key-value對追加到Properties裡
    • void store(OutputStream out, String comments):將Properties中的key-value對輸出到指定的屬性檔案中
    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        // 向Properties中增加屬性
        props.setProperty("username" , "yeeku");
        props.setProperty("password" , "123456");
        // 將Properties中的key-value對儲存到a.ini檔案中
        props.store(new FileOutputStream("a.ini"), "comment line");   //①
        // 新建一個Properties物件
        Properties props2 = new Properties();
        // 向Properties中增加屬性
        props2.setProperty("gender" , "male");
        // 將a.ini檔案中的key-value對追加到props2中
        props2.load(new FileInputStream("a.ini") );   //②
        System.out.println(props2);
        props2.loadFromXML(new FileInputStream("b.xml"));
        props2.put("time","2016/9/13");
        props2.setProperty("name","liuqinyuan");
        props2.storeToXML(new FileOutputStream("c.xml"), "劉沁源","UTF-8");
    }

3.5 SortedMap介面和TreeMap實現類

  • TreeMap是一個紅黑樹資料結構,每個key-value對即作為紅黑樹的一個節點,儲存節點的時候,需要根據key對節點進行排序,採用兩種排序方式:自然排序和定製排序
  • TreeMap提供的方法:
    • Map.Entry firstEntry():返回該Map中最小key所對應的key-value對,如果該Map為空,則返回null
    • Object firstKey():返回該Map中的最小key值,如果該Map為空,則返回null
    • Map.Entry lastEntry():返回該Map中最大key所對應的key-value對,如果該Map為空或不存在這樣的key-value對,則返回null
    • Object lastKey():返回該Map中最大key值,如果該Map為空或不存在這樣的key-value對,則返回null
    • Map.Entry higherEntry(Object key):返回該Map中位於key後一位的key-value對,如果該Map為空,則返回null
    • Object higherKey(Object key) :返回該Map中位於key後一位的key值,如果該Map為空或不存在這樣的key-value對,則返回null
    • Map.Entry lowerEntry(Object key):返回該Map中位於key前一位的key-value對,如果該Map為空,則返回null
    • Object lowerEntry(Object key) :返回該Map中位於key前一位的key值,如果該Map為空或不存在這樣的key-value對,則返回null
    • NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey, boolean toInclusive):返回該Map的子Map,其key值的範圍是從fromKey到toKey
    • SortedMap subMap(Object fromKey, Object toKey) :返回該Map的子Map,其key值的範圍是從fromKey(包括)到toKey(不包括)
    • SortedMap tailMap(Object fromKey):返回該Map的子Map,其key值的範圍是大於fromKey(包括)的所有key
    • NavigableMap tailMap(Object fromKey, boolean fromInclusive):返回該Map的子Map,其key值的範圍是大於fromKey的所有key
    • SortedMap headMap(Object toKey):返回該Map的子Map,其key值的範圍是小與toKey(不包括)的所有key
    • NavigableMap headMap(Object toKey, boolean inclusive):返回該Map的子Map,其key值的範圍是小於toKey的所有key

3.6 WeakHashMap實現類

  • WeakHashMap的key只保留了對實際物件的弱引用,可能會被垃圾回收機制回收

3.7 IdentityHashMap實現類

  • 和HashMap的區別在於判別兩個key相等時的機制,此時的key必須嚴格相等(key1 == key2),而HashMap實現的是equals()方法

3.8 EnumMap實現類

  • EnumMap中的所有key都必須是單個列舉類的列舉值,建立EnumMap時必須顯式或隱式指定它對應的列舉類
    • Enmu列舉類的特徵:內部以陣列形式儲存,效能高
    • 依據key在列舉類中的順序排序
    • 不允許使用null做key,但是可以做value

3.9 各Map實現類的效能分析

  1. HashMap效能優於Hashtable;
  2. TreeMap通常比HashMap、Hashtable慢;
  3. TreeMap中的key-value總是處於有序狀態;
  4. 推薦使用HashMap;
  5. LinkedHashMap比HashMap慢,可維護新增順序,使用==而非equals判斷相等
  6. EnumMap的效能最好,但實際key有限制,只能是屬於同一個列舉類
    g) 操作集合的工具類:Collections
     Collections可以操作Set、List、Map等集合,用於排序、查詢、修改等

3.10 排序

  • Collections提供瞭如下方法用於對List集合的排序:
    • void reverse(List list):反轉指定List集合元素的順序
    • void shuffle(List list):對List集合元素進行隨機排序
    • void sort(List list):根據元素的自然順序對指定List集合的元素按升序進行排序
    • void sort(List list, Comparator c):根據指定Comparator產生的順序對List集合元素進行排序
    • void swap(List list, int i, int j):將指定List集合中的i處元素和j處元素進行交換
    • void rotate(List list, int distance):當distance為正數時,將list集合的後distance個元素“整體”移到前面,當distance為負數的時候,將List集合的前distance個元素“整體”移到後面。

3.11 查詢、替換

  • Collections提供的查詢、替換集合元素的類方法:
    • int binarySearch(List list, Object key):使用二分搜尋法搜尋指定的List集合,以或得指定物件在List集合中的索引,強調List必須處於有序狀態
    • Object max(Collection coll):根據元素的自然順序,返回給定集合中的最大元素
    • Object max(Collection coll, Comparator comp):根據Comparator指定的順序,返回給定集合中的最大元素
    • Object min(Collection coll):根據元素的自然順序,返回給定集合中的最小元素
    • Object min(Collection coll, Comparator comp):根據Comparator指定的順序,返回給定集合中的最小元素
    • void fill(List list, Object obj):使用指定元素obj替換指定List集合中的最小元素
    • int frequency(Collection c, Object o):返回指定集合中指定元素的出現次數
    • int indexOfSubList(List source, List target):返回子List物件在父List物件中第一次出現的位置索引,如果沒有,返回-1
    • int lastIndexOfSubList(List source, List target):返回子List物件在父List物件中最後一次出現的位置索引,如果沒有,返回-1
    • boolean replaceAll(List list, Object oldVal, Object newVal):使用一個新值newVal替換List物件中所有舊值oldVal

3.12 同步控制

  • Collections類提供了多個synchronizedXxx()方法,將指定集合包裝成執行緒同步安全的集合。
    public static void main(String[] args){
        // 下面程式建立了四個執行緒安全的集合物件
        Collection c = Collections.synchronizedCollection(new ArrayList());
        List list = Collections.synchronizedList(new ArrayList());
        Set s = Collections.synchronizedSet(new HashSet());
        Map m = Collections.synchronizedMap(new HashMap());
    }

3.13 設定不可變集合

  1. emptyXxx():返回一個空的、不可變的集合,此處的集合既可以是List,也可以是SortedSet、Set、SortedMap、Map等
  2. singletonXxx():返回一個只包含指定物件的,不可變的集合物件,可以是List或Map
  3. unmodifiableXxx():返回指定集合物件的不可變檢視,可以使List、Set、SortedSet、Map、SortedMap