天天看點

Java入門 - 進階教程 - 02.集合集合

原文位址: http://www.work100.net/training/java-collection.html 更多教程: 光束雲 - 免費課程

集合

請參照如上

章節導航

進行閱讀

1.概述

早在 Java 2 中之前,Java 就提供了特設類。比如:

Dictionary

,

Vector

Stack

, 和

Properties

這些類用來存儲和操作對象組。

雖然這些類都非常有用,但是它們缺少一個核心的,統一的主題。由于這個原因,使用

Vector

類的方式和使用

Properties

類的方式有着很大不同。

集合架構被設計成要滿足以下幾個目标:

  • 該架構必須是高性能的。基本集合(動态數組,連結清單,樹,哈希表)的實作也必須是高效的
  • 該架構允許不同類型的集合,以類似的方式工作,具有高度的互操作性
  • 對一個集合的擴充和适應必須是簡單的

為此,整個集合架構就圍繞一組标準接口而設計。你可以直接使用這些接口的标準實作,諸如:

LinkedList

HashSet

TreeSet

等,除此之外你也可以通過這些接口實作自己的集合。

Java入門 - 進階教程 - 02.集合集合

從上面的集合架構圖可以看到,Java 集合架構主要包括兩種類型的容器,一種是集合(

Collection

),存儲一個元素集合,另一種是圖(

Map

),存儲鍵/值對映射。

Collection

接口又有 3 種子類型,

List

Set

Queue

,再下面是一些抽象類,最後是具體實作類,常用的有

ArrayList

LinkedList

HashSet

LinkedHashSet

HashMap

LinkedHashMap

等等。

集合架構是一個用來代表和操縱集合的統一架構。所有的集合架構都包含如下内容:

  • 接口:是代表集合的抽象資料類型。例如

    Collection

    List

    Set

    Map

    等。之是以定義多個接口,是為了以不同的方式操作集合對象
  • 實作(類):是集合接口的具體實作。從本質上講,它們是可重複使用的資料結構,例如:

    ArrayList

    LinkedList

    HashSet

    HashMap

  • 算法:是實作集合接口的對象裡的方法執行的一些有用的計算,例如:搜尋和排序。這些算法被稱為多态,那是因為相同的方法可以在相似的接口上有着不同的實作

除了集合,該架構也定義了幾個

Map

接口和類。

Map

裡存儲的是鍵/值對。盡管

Map

不是集合,但是它們完全整合在集合中。

集合架構體系如圖所示

Java入門 - 進階教程 - 02.集合集合

Java 集合架構提供了一套性能優良,使用友善的接口和類,Java 集合架構位于

java.util

包中, 是以當使用集合架構的時候需要進行導包。

2.集合接口

集合架構定義了一些接口。本節提供了每個接口的概述:

接口描述

Collection

Collection

是最基本的集合接口,一個

Collection

代表一組

Object

,即

Collection

的元素, Java不提供直接繼承自

Collection

的類,隻提供繼承于的子接口(如

List

set

)。

Collection

接口存儲一組不唯一,無序的對象。

List

List

接口是一個有序的

Collection

,使用此接口能夠精确的控制每個元素插入的位置,能夠通過索引(元素在

List

中位置,類似于數組的下标)來通路

List

中的元素,第一個元素的索引為 ,而且允許有相同的元素。

List

接口存儲一組不唯一,有序(插入順序)的對象。

Set

Set

具有與

Collection

完全一樣的接口,隻是行為上不同,

Set

不儲存重複的元素。

Set

接口存儲一組唯一,無序的對象。

SortedSet

繼承于

Set

儲存有序的集合。

Map

Map

接口存儲一組鍵值對象,提供

key

(鍵)到

value

(值)的映射。

Map.Entry

描述在一個

Map

中的一個元素(鍵/值對)。是一個

Map

的内部類。

SortedMap

Map

,使

Key

保持在升序排列。
8

Enumeration

這是一個傳統的接口和定義的方法,通過它可以枚舉(一次獲得一個)對象集合中的元素。這個傳統接口已被疊代器取代。

Set和List的差別

  • Set

    接口執行個體存儲的是無序的,不重複的資料。

    List

    接口執行個體存儲的是有序的,可以重複的元素。
  • Set

    檢索效率低下,删除和插入效率高,插入和删除不會引起元素位置改變

    <實作類有HashSet,TreeSet>

  • List

    和數組類似,可以動态增長,根據實際存儲的資料的長度自動增長

    List

    的長度。查找元素效率高,插入删除效率低,因為會引起其他元素位置改變

    <實作類有ArrayList,LinkedList,Vector>

3.集合實作類(集合類)

Java 提供了一套實作了

Collection

接口的标準集合類。其中一些是具體類,這些類可以直接拿來使用,而另外一些是抽象類,提供了接口的部分實作。

标準集合類彙總于下表:

類描述

AbstractCollection

實作了大部分的集合接口。

AbstractList

AbstractCollection

并且實作了大部分List接口。

AbstractSequentialList

AbstractList

,提供了對資料元素的鍊式通路而不是随機通路。

LinkedList

該類實作了

List

接口,允許有

null

(空)元素。主要用于建立連結清單資料結構,該類沒有同步方法,如果多個線程同時通路一個

List

,則必須自己實作通路同步,解決方法就是在建立

List

時候構造一個同步的

List

。例如:

Listlist=Collections.synchronizedList(newLinkedList(...));

LinkedList

查找效率低。

ArrayList

該類也是實作了

List

的接口,實作了可變大小的數組,随機通路和周遊元素時,提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。

ArrayList

增長目前長度的50%,插入删除效率低。

AbstractSet

AbstractCollection

并且實作了大部分

Set

接口。

HashSet

該類實作了Set接口,不允許出現重複元素,不保證集合中元素的順序,允許包含值為

null

的元素,但最多隻能一個。

LinkedHashSet

具有可預知疊代順序的

Set

接口的哈希表和連結清單實作。
9

TreeSet

該類實作了Set接口,可以實作排序等功能。
10

AbstractMap

實作了大部分的Map接口。
11

HashMap

HashMap

是一個散清單,它存儲的内容是鍵值對(

key-value

)映射。

Map

接口,根據鍵的

HashCode

值存儲資料,具有很快的通路速度,最多允許一條記錄的鍵為

null

,不支援線程同步。
12

TreeMap

繼承了

AbstractMap

,并且使用一顆樹。
13

WeakHashMap

繼承

AbstractMap

類,使用弱密鑰的哈希表。
14

LinkedHashMap

HashMap

,使用元素的自然順序對元素進行排序.
15

IdentityHashMap

AbstractMap

類,比較文檔時使用引用相等。

在前面的教程中已經讨論通過

java.util

包中定義的類,如下所示:

Vector

該類和

ArrayList

非常相似,但是該類是同步的,可以用在多線程的情況,該類允許設定預設的增長長度,預設擴容方式為原來的2倍。

Stack

棧是

Vector

的一個子類,它實作了一個标準的後進先出的棧。

Dictionary

Dictionary

類是一個抽象類,用來存儲鍵/值對,作用和Map類相似。

Hashtable

Hashtable

Dictionary

(字典) 類的子類,位于

java.util

包中。

Properties

Properties

Hashtable

,表示一個持久的屬性集,屬性清單中每個鍵及其對應值都是一個字元串。

BitSet

一個

BitSet

類建立一種特殊類型的數組來儲存位值。

BitSet

中數組大小會随需要增加。

4.集合算法

集合架構定義了幾種算法,可用于集合和映射。這些算法被定義為集合類的靜态方法。

在嘗試比較不相容的類型時,一些方法能夠抛出

ClassCastException

異常。當試圖修改一個不可修改的集合時,抛出

UnsupportedOperationException

異常。

集合定義三個靜态的變量:

EMPTY_SET

EMPTY_LIST

EMPTY_MAP

,這些變量都不可改變。

算法描述

Collection Algorithms

這裡是一個清單中的所有算法實作。

5.如何使用疊代器

通常情況下,你會希望周遊一個集合中的元素。例如,顯示集合中的每個元素。

一般周遊數組都是采用

for

循環或者增強

for

,這兩個方法也可以用在集合架構,但是還有一種方法是采用疊代器周遊集合架構,它是一個對象,實作了

Iterator

接口或

ListIterator

疊代器,使你能夠通過循環來得到或删除集合的元素。

ListIterator

Iterator

,以允許雙向周遊清單和修改元素。

疊代器方法描述
使用 Java

Iterator

這裡通過執行個體列出

Iterator

listIterator

接口提供的所有方法。

周遊 ArrayList

執行個體:

import java.util.*;
 
public class Test{
 public static void main(String[] args) {
     List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一種周遊方法使用 For-Each 周遊 List
     for (String str : list) {            //也可以改寫 for(int i=0;i<list.size();i++) 這種形式
        System.out.println(str);
     }
 
     //第二種周遊,把連結清單變為數組相關的内容進行周遊
     String[] strArray=new String[list.size()];
     list.toArray(strArray);
     for(int i=0;i<strArray.length;i++) //這裡也可以改寫為  for(String str:strArray) 這種形式
     {
        System.out.println(strArray[i]);
     }
     
    //第三種周遊 使用疊代器進行相關周遊
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())//判斷下一個元素之後有值
     {
         System.out.println(ite.next());
     }
 }
}           

解析:

三種方法都是用來周遊

ArrayList

集合,第三種方法是采用疊代器的方法,該方法可以不用擔心在周遊的過程中會超出集合的長度。

周遊 Map

import java.util.*;
 
public class Test{
     public static void main(String[] args) {
      Map<String, String> map = new HashMap<String, String>();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
      
      //第一種:普遍使用,二次取值
      System.out.println("通過Map.keySet周遊key和value:");
      for (String key : map.keySet()) {
       System.out.println("key= "+ key + " and value= " + map.get(key));
      }
      
      //第二種
      System.out.println("通過Map.entrySet使用iterator周遊key和value:");
      Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
      while (it.hasNext()) {
       Map.Entry<String, String> entry = it.next();
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
      
      //第三種:推薦,尤其是容量大時
      System.out.println("通過Map.entrySet周遊key和value");
      for (Map.Entry<String, String> entry : map.entrySet()) {
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
    
      //第四種
      System.out.println("通過Map.values()周遊所有的value,但不能周遊key");
      for (String v : map.values()) {
       System.out.println("value= " + v);
      }
     }
}           

6.如何使用比較器

TreeSet

TreeMap

的按照排序順序來存儲元素. 然而,這是通過比較器來精确定義按照什麼樣的排序順序。

這個接口可以讓我們以不同的方式來排序一個集合。

比較器方法描述

Comparator

Comparator

接口提供的所有方法

7.總結

Java 集合架構為程式員提供了預先包裝的資料結構和算法來操縱他們。

集合是一個對象,可容納其他對象的引用。集合接口聲明對每一種類型的集合可以執行的操作。

集合架構的類和接口均在

java.util

任何對象加入集合類後,自動轉變為

Object

類型,是以在取出的時候,需要進行強制類型轉換。

上一篇:

資料結構

下一篇:

泛型
如果對課程内容感興趣,可以掃碼關注我們的

公衆号

QQ群

,及時關注我們的課程更新
Java入門 - 進階教程 - 02.集合集合
Java入門 - 進階教程 - 02.集合集合