1. 程式人生 > >Java集合框架List,Map,Set, Queue介紹

Java集合框架List,Map,Set, Queue介紹

Java Collections Framework是Java提供的對集合進行定義,操作,和管理的包含一組介面,類的體系結構。

Collection介面

    Collection是最基本的集合介面,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。

    所有實現Collection介面的類都必須提供兩個標準的建構函式:無引數的建構函式用於建立一個空的Collection,有一個Collection引數的建構函式用於建立一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。後一個建構函式允許使用者複製一個Collection。

List介面

    List繼承自Collection介面。List是有序的Collection,使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在List中的位置,類似於陣列下標)來訪問List中的元素,這類似於Java的陣列。

    跟Set集合不同的是,List允許有重複元素。對於滿足e1.equals(e2)條件的e1與e2物件元素,可以同時存在於List集合中。當然,也有List的實現類不允許重複元素的存在。

    除了具有Collection介面必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator介面,和標準的Iterator介面相比,ListIterator多了一些add()之類的方法,允許新增,刪除,設定元素,還能向前或向後遍歷。

    實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。

LinkedList類

    LinkedList實現了List介面,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆疊(stack),佇列(queue)或雙向佇列(deque)。

    注意LinkedList沒有同步方法。如果多個執行緒同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在建立List時構造一個同步的List:

List list =Collections.synchronizedList(new LinkedList(...)); 

ArrayList類

    ArrayList實現了可變大小的陣列。它允許所有元素,包括null。ArrayList沒有同步。

size,isEmpty,get,set方法執行時間為常數。但是add方法開銷為分攤的常數,新增n個元素需要O(n)的時間。其他的方法執行時間為線性。

    每個ArrayList例項都有一個容量(Capacity),即用於儲存元素的陣列的大小。這個容量可隨著不斷新增新元素而自動增加,但是增長演算法並沒有定義。當需要插入大量元素時,在插入前可以呼叫ensureCapacity方法來增加ArrayList的容量以提高插入效率。

    和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。

Vector類

    Vector非常類似ArrayList,但是Vector是同步的。由Vector建立的Iterator,雖然和ArrayList建立的 Iterator是同一介面,但是,因為Vector是同步的,當一個Iterator被建立而且正在被使用,另一個執行緒改變了Vector的狀態(例如,新增或刪除了一些元素),這時呼叫Iterator的方法時將丟擲ConcurrentModificationException,因此必須捕獲該異常。

Stack 類

    Stack繼承自Vector,實現一個後進先出的堆疊。Stack提供5個額外的方法使得Vector得以被當作堆疊使用。基本的push和pop方 法,還有peek方法得到棧頂的元素,empty方法測試堆疊是否為空,search方法檢測一個元素在堆疊中的位置。Stack剛建立後是空棧。

Set介面

    Set繼承自Collection介面。Set是一種不能包含有重複元素的集合,即對於滿足e1.equals(e2)條件的e1與e2物件元素,不能同時存在於同一個Set集合裡,換句話說,Set集合裡任意兩個元素e1和e2都滿足e1.equals(e2)==false條件,Set最多有一個null元素。

     因為Set的這個制約,在使用Set集合的時候,應該注意:

    1,為Set集合裡的元素的實現類實現一個有效的equals(Object)方法。

    2,對Set的建構函式,傳入的Collection引數不能包含重複的元素。

    請注意:必須小心操作可變物件(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)=true將導致一些問題。

HashSet類

    此類實現 Set 介面,由雜湊表(實際上是一個 HashMap 例項)支援。它不保證集合的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。

    HashSet不是同步的,需要用以下語句來進行S同步轉換:

            Sets = Collections.synchronizedSet(new HashSet(...));

Map介面

    Map沒有繼承Collection介面。也就是說Map和Collection是2種不同的集合。Collection可以看作是(value)的集合,而Map可以看作是(key,value)的集合。

    Map介面由Map的內容提供3種類型的集合檢視,一組key集合,一組value集合,或者一組key-value對映關係的集合。

Hashtable類

    Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。

    新增資料使用put(key,value),取出資料使用get(key),這兩個基本操作的時間開銷為常數。

Hashtable 通過initial capacity和load factor兩個引數調整效能。通常預設的load factor 0.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查詢時間將增大,這會影響像get和put這樣的操作。

Hashtable是同步的。

HashMap類

    HashMap和Hashtable類似,不同之處在於HashMap是非同步的,並且允許null,即null value和null key。,但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。

WeakHashMap類

    WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那麼該key可以被GC回收。

對集合操作的工具類

    Java提供了java.util.Collections,以及java.util.Arrays類簡化對集合的操作

    java.util.Collections主要提供一些static方法用來操作或建立Collection,Map等集合。

java.util.Arrays主要提供static方法對陣列進行操作。

Queue

    Queue用於模擬"佇列"這種資料結構(先進先出 FIFO)。佇列的頭部儲存著佇列中存放時間最長的元素,佇列的尾部儲存著佇列中存放時間最短的元素。新元素插入(offer)到佇列的尾部,訪問元素(poll)操作會返回佇列頭部的元素,佇列不允許隨機訪問佇列中的元素。結合生活中常見的排隊就會很好理解這個概念

PriorityQueue

        PriorityQueue並不是一個比較標準的佇列實現,PriorityQueue儲存佇列元素的順序並不是按照加入佇列的順序,而是按照佇列元素的大小進行重新排序,這點從它的類名也可以    看出來

Deque

        Deque介面代表一個"雙端佇列",雙端佇列可以同時從兩端來新增、刪除元素,因此Deque的實現類既可以當成佇列使用、也可以當成棧使用

 ArrayDeque

            是一個基於陣列的雙端佇列,和ArrayList類似,它們的底層都採用一個動態的、可重分配的Object[]陣列來儲存集合元素,當集合元素超出該陣列的容量時,系統會在底層重新分配一個Object[]陣列來儲存集合元素

總結

    如果涉及到堆疊,佇列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。

    如果程式在單執行緒環境中,或者訪問僅僅在一個執行緒中進行,考慮非同步的類,其效率較高,如果多個執行緒可能同時操作一個類,應該使用同步的類。

    在除需要排序時使用TreeSet,TreeMap外,都應使用HashSet,HashMap,因為他們 的效率更高。

    要特別注意對雜湊表的操作,作為key的物件要正確複寫equals和hashCode方法。

    容器類僅能持有物件引用(指向物件的指標),而不是將物件資訊copy一份至數列某位置。一旦將物件置入容器內,便損失了該物件的型別資訊。

    儘量返回介面而非實際的型別,如返回List而非ArrayList,這樣如果以後需要將ArrayList換成LinkedList時,客戶端程式碼不用改變。這就是針對抽象程式設計。

注意:

1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。

2、Set和Collection擁有一模一樣的介面。

3、List,可以通過get()方法來一次取出一個元素。使用數字來選擇一堆物件中的一個,get(0)...。(add/get)

4、一般使用ArrayList。用LinkedList構造堆疊stack、佇列queue。

5、Map用 put(k,v) /get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個key/value。

      HashMap會利用物件的hashCode來快速找到key。

6、Map中元素,可以將key序列、value序列單獨抽取出來。

使用keySet()抽取key序列,將map中的所有keys生成一個Set。

使用values()抽取value序列,將map中的所有values生成一個Collection。

為什麼一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重複。


相關推薦

Java集合總結(ListMapSet)

集合的引入  當我們有種需求,需要儲存多個元素的結構時,我們前面講過陣列,陣列可以儲存。但是陣列也有它的弊端,使用的時候,必須先定義好長度,也就是陣列的長度是固定,不能根據我們的需求自動變長或者變短。 我們看一個例項:先定義一個Student類: 1 public class Stud

Java集合框架ListMapSet Queue介紹

Java Collections Framework是Java提供的對集合進行定義,操作,和管理的包含一組介面,類的體系結構。 Collection介面     Collection是最基本的集合介面,一個Collection代表一組Object的集合,這些Objec

Java集合框架List+Set+Map基本操作

一、List集合  List的特徵是其元素以線性方式儲存,集合中可以存放重複物件。  List介面主要實現類包括:   ArrayList : 代表長度可以改變得陣列。可以對元素進行隨機的訪問,向

三大集合ListMapSet的區別與聯系

cto 接口實現 支持 保存 strong 3.2 link 決定 2.3 List、Map、Set的區別與聯系 一、結構特點 List和Set是存儲單列數據的集合,Map是存儲鍵值對這樣的雙列數據的集合; List中存儲的數據是有順序的,並且值允許重復; Map中存儲的

Java集合框架15:Map集合

Map介紹 1、將值對映到值的物件。 2、一個對映不能包含重複的鍵。 3、每個鍵最多隻能對映到一個值。 Map介面和Collection介面的不同 1、Map是雙列的,Collection是單列的。 2、Map的鍵唯一,Collection的子體系Set

Java————集合框架——list

目錄 (1)增加 (5)刪除 (6)替換 四:遍歷。 一:List介面(使用的初步介紹) 1:List集合的特徵 ——:第一個是有序; ——:第二個集合可以重複; (1)Ar

三大集合ListMapSet的區別與聯絡

List、Map、Set的區別與聯絡 一、結構特點 List和Set是儲存單列資料的集合,Map是存儲鍵值對這樣的雙列資料的集合; List中儲存的資料是有順序的,並且值允許重複; Map中儲存的資料是無序的,它的鍵是不允許重複的,但是值是允許重複的; Set中儲存的資料是無順序的,並且不允許重複,但元素在

JAVA集合框架——List

List List介紹 List體系結構 ArrayList LinkedList List介紹 list集合可以裝任意型別,裡面的資料有序且可以重複 List體系結構 ArrayList

Java集合框架——List介面

第三階段 JAVA常見物件的學習 集合框架——List介面 按照集合框架的繼承體系,我們先從Collection中的List介

ListMapSetQueue的區別與關係

List、Set、Queue 都繼承自 Collection 介面,而 Map 則不是(繼承自 Object),所以容器類有兩個根介面,分別是 Collection 和 Map,Collection 表示單個元素的集合,Map 表示鍵值對的集合。 List 的主要特點就是有

Java集合ListSetMap的區別ArrayList和LinkedList有何區別..........

一、陣列和集合的區別:   陣列是大小固定的,並且同一個陣列只能存放型別一樣的資料(基本型別/引用型別);   集合可以儲存和操作數目不固定的一組資料。 所有的JAVA集合都位於 java.util包中! JAVA集合只能存放引用型別的的資料,不能存放基本資料型別。   陣列和集合相比唯一的有點就是速度

常用JAVA集合框架(Collection、ListSetMap

注意,此實現不是同步的。如果多個執行緒同時訪問一個 ArrayList 例項,而其中至少一個執行緒從結構上修改了列表,那麼它必須 保持外部同步。(結構上的修改是指任何新增或刪除一個或多個元素的操作,或者顯式調整底層陣列的大小;僅僅設定元素的值不是結構上的修改。)應該使用 Collections.synchro

JAVA集合框架ListMapSet之間的選擇~小案例分析

案例分析 案例介紹:簡易撲克牌遊戲。 功能描述: 二:實現洗牌 三:實現發牌 四:得出輸贏 集合(list、set、map)的選擇 既然要比較,我們還是先從JAVA集合的祖先來介紹。 陣列 時間本沒有集合,但有人想要,所以有了集合

Java集合List Set Map

set map 集合 java集合類 索引 擁有 對象 ava 重復 排序 1.List(有序、可重復) (1)List裏存放的對象是有序的,而且可以重復。 (2)List關註的是索引,擁有一系列索引相關的方法。 (3)往其中插入或刪除數據時,後面的數據會移動。 2.S

ListMapset的加載因子默認初始容量和擴容增量

nbsp 同步 ble 分配 eat 提高 調用 width 可見 首先,這三個概念說下。初始大小,就是創建時可容納的默認元素個數;加載因子,表示某個閥值,用0~1之間的小數來表示,當已有元素占比達到這個閥值後,底層將進行擴容操作;擴容方式,即指定每次擴容後的大小的規則,比

Java集合框架上機練習題:編寫一個Book類該類至少有name和price兩個屬性。該類要實現Comparable接口在接口的compareTo()方法.....

ext .cn 數據庫 識別 方法 屬性 set package compareto 編寫一個Book類,該類至少有name和price兩個屬性。該類要實現Comparable接口,在接口的compareTo()方法中規定兩個Book類實例的大小關系為二者的price屬性的

ListMapSet三個接口存取元素時各有什麽特點?

大小 rdquo 內部排序 多次調用 不同 別人 存取 排隊 object 這樣的題屬於隨意發揮題:這樣的題比較考水平,兩個方面的水平:一是要真正明白這些內容,二是要有較強的總結和表述能力。如果你明白,但表述不清楚,在別人那裏則等同於不明白。 首先,List與Set具有相

Java基礎知識(JAVA集合框架ListSet

開發 如果 表數 特點 必須 加鎖 以及 stringbu 不可 List和Set概述數組必須存放同一種元素。StringBuffer必須轉換成字符串才能使用,如果想拿出單獨的一個元素幾乎不可能。數據有很多使用對象存,對象有很多,使用集合存。 集合容器因為內部

Java集合框架中底層文件的ListSet

Java集合框架中的List與Set // 簡書作者:達叔小生 Collection -> Set 無序不重複 -> 無序HashSet,需要排序TreeSet -> List 有序可重複 -> 查,改ArrayList,增刪LinkedList

Java 知識點整理-11.Java集合框架 Set+HashSet+LinkedHashSet+TreeSet+ListSet迭代方式的區別

目錄 Set HashSet LinkedHashSet TreeSet List和Set迭代方式的區別: Set 1、Set集合概述及特點: public interface Set<E> extends Collection<E>