1. 程式人生 > >Java 高階-集合框架

Java 高階-集合框架

參考資料
參考 HashMap

類似 C++ 中的 STL 標準模板庫,Java 也在 java.util 包中封裝了一套常用資料結構及其演算法,稱為集合框架。所有的集合框架都包含如下內容:

  • 介面:代表集合的抽象資料型別 ADT,如 Collection、List、Set、Map 等
  • 實現(類):集合介面的具體實現,是可重複使用的資料結構,例如:ArrayList、LinkedList、HashSet、HashMap。
  • 演算法:實現集合介面的物件裡的方法,可以執行一些有用的計算,例如:搜尋和排序。這些演算法具有多型性,相同方法在相似的介面上有著不同的實現。

除了集合,Java 的集合框架也定義了幾個 Map 介面和類。Map 裡儲存的是鍵/值對。儘管 Map 不是集合,但是它們完全整合在集合中。

集合框架概述

Java 集合框架分為兩大類:

  • Map 鍵值對的集合,包括SortedMap
  • Collection 元素的集合,包括Set(包括 SortedSet)、List、Queue

Java 集合框架圖

主要介面及常用的實現類

具體實現類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

Collection 介面

常用方法

查詢方法

方法名 描述
int size() 返回集合中元素個數
boolean isEmpty() 如果集合中沒有元素則返回 true
boolean contains(Object obj) 判斷物件是否在集合中
boolean containsAll(Collection c) 判斷方法的接收者物件是否包含集合中的所有元素

修改方法

方法名 描述
boolean add(Object obj) 向集合中增加物件
boolean addAll(Collection<?> c) 將引數集合中的所有元素增加到接收者集合中
boolean remove(Object obj) 刪除物件
boolean removeAll(Collection c) 將引數集合中的所有元素從接收者集合中刪除
boolean retainAll(Collection c) 與 removeAll 方法相反,只保留引數集合中的所有元素

List 介面

有序列表,元素可重複。

實現類

  • Vector
  • ArrayList:儲存方式類似陣列,訪問速度快
  • LinkedList:儲存方式類似連結串列,增刪速度快

Set 介面

無序集合,元素不可重複。

實現類

  • HashSet
  • TreeSet 樹集合

SortedSet 介面

特殊的有序 Set,元素升序排列,還增加了次序的相關操作。

Queue介面

FIFO 先進先出佇列。

實現類

  • LinkedList:同時實現了 List 介面,先進先出
  • PriorityList:按元素值排序的佇列

Map 介面

儲存鍵值對。需要同時指定鍵和值的型別 Map<k, v>

實現類

  • HashMap
  • TreeMap

SortedMap

特殊 Map,關鍵字升序排列。通常用於字典。

相關演算法

大多演算法用於 List,min 和max 可以用於所有集合物件。

排序演算法 sort

使 List 中的元素按照某種次序關係升序排列。

  • 將元素按照自然次序排列,或者集合實現了 Comparable 介面
  • 附加 Comparator 物件做引數,規定比較規則,可實現反序或特殊規則

亂序演算法 shuffle

可用於洗牌,每個次序出現的概率都是一樣的。

反序 reverse

二分查詢演算法 binarySearch

Arrays 類

需要引入 java.util.Arrays
常用方法:

方法 描述
sort(type[] a) 排序
binarySearch() 二分查詢
equals(type[] a, type[] b) 陣列比較
fill(type[] a, type val) 陣列填充同一個值
asList(T… a) 將陣列轉為 ArrayList

基於動態陣列的型別

Vector (集合框架的遺留類,不建議使用,執行緒安全)和 ArrayList(非同步,效率高,建議用) :

  • 實現了 Collection 介面
  • 不能儲存基本資料型別,需要包在包裝類中
  • 可以儲存同類型的物件
  • 容量可以自動擴充

Java 提供了執行緒安全集合 java.util.concurrent 包,有序集、佇列,任何集合類通過使用同步包裝器可以變成執行緒安全的:

List<E> synchArrayList = Collections.synchronisedList(new ArrayList<E>());

遍歷實現了 Collection 介面的集合

  • 通過 Enumeration (舊介面,不推薦使用)或 Iterator 介面(新介面,推薦)遍歷集合
  • 通過增強的 for 迴圈遍歷集合
  • 通過聚集操作遍歷集合,可以在篩選的同時過濾

Enumeration/Iterator

Java 中的許多方法(例如 elements())返回 Enumeration 型別的物件,而不是返回集合類物件。

Enumeration 介面不能用於 ArrayList 物件,Iterator 介面可用於 ArrayList 物件和 Vector 物件。

Iterator 介面遍歷物件的同時,可以刪除物件。常用方法有:

  • hasNext():集合中是否還有下一個元素
  • next():取集合的下一個元素
  • remove():刪除集合中最後呼叫 next() 返回的元素,注意不是從 Iterator 類中刪除

示例:

import java.util.*;

class test {
    public static void main(String[] args) {
        String[] s = {"hello", "world", "haha"};
        ArrayList al = new ArrayList<String> (java.util.Arrays.asList(s));
        System.out.println("before: " + al);
        Iterator it = al.iterator();
        while(it.hasNext()) {
            String tmp = (String)it.next();
            System.out.println(tmp);
            if (tmp.length() > 4) {
                it.remove();
            }
        }
        System.out.println("after: " + al);
    }
}

輸出:

before: [hello, world, haha]
hello
world
haha
after: [haha]

Map 介面

Map 中儲存鍵值對,主要實現類是 HashMap。

常用的修改方法和查詢方法有:

示例:

import java.io.*;
import java.util.*;
class test  {
    public static void main(String[] args) {
        String[] arr = {"hello", "world"};
        Map m = new HashMap();
        System.out.println(m.isEmpty() ? "empty map" : "not empty map");
        m.put("one", "this is a string");
        m.put("two", arr);
        System.out.println(m.containsKey("one"));
        System.out.println(m);
                
        Iterator iter = m.entrySet().iterator();
        while(iter.hasNext()) {
            Map.Entry entry = (Map.Entry)iter.next();
            System.out.println("next : "+ entry.getKey() +" - "+entry.getValue());
        }
    }
}

輸出:

empty map
true
{one=this is a string, two=[Ljava.lang.String;@659e0bfd}
next : one - this is a string
next : two - [Ljava.lang.String;@659e0bfd