天天看點

JAVA對象容器學習心得

         在程式運用過程中,很多時候需要将對象暫時存儲在一個容器裡面統一管理,等到需要的時候再取出來,可以使用循環有序的索引連結清單(List)結構來存儲對象,或是使用不允許重複對象的集合(Set)結構,也可以使用“鍵——值”(Key-Value)存取Map。

 一:List 

     有序的 collection(也稱為序列)。此接口的使用者可以對清單中每個元素的插入位置進行精确地控制。使用者可以根據元素的整數索引(在清單中的位置)通路元素,并搜尋清單中的元素。

    與 set 不同,清單通常允許重複的元素。更确切地講,清單通常允許滿足 e1.equals(e2) 的元素對 e1 和 e2,并且如果清單本身允許 null 元素的話,通常它們允許多個 null 元素。難免有人希望通過在使用者嘗試插入重複元素時抛出運作時異常的方法來禁止重複的清單,但我們希望這種用法越少越好。

   List 接口在 iterator、add、remove、equals 和 hashCode 方法的協定上加了一些其他約定,超過了 Collection 接口中指定的約定。為友善起見,這裡也包括了其他繼承方法的聲明。

List 接口提供了 4 種對清單元素進行定位(索引)通路方法。清單(像 Java 數組一樣)是基于 0 的。注意,這些操作可能在和某些實作(例如 LinkedList 類)的索引值成比例的時間内執行。是以,如果調用者不知道實作,那麼在清單元素上疊代通常優于用索引周遊清單。

List 接口提供了特殊的疊代器,稱為 ListIterator,除了允許 Iterator 接口提供的正常操作外,該疊代器還允許元素插入和替換,以及雙向通路。還提供了一個方法來擷取從清單中指定位置開始的清單疊代器。

  List 接口提供了兩種搜尋指定對象的方法。從性能的觀點來看,應該小心使用這些方法。在很多實作中,它們将執行高開銷的線性搜尋。

List 接口提供了兩種在清單的任意位置高效插入和移除多個元素的方法。

       注意:盡管清單允許把自身作為元素包含在内,但建議要特别小心:在這樣的清單上,equals 和 hashCode 方法不再是定義良好的。

某些清單實作對清單可能包含的元素有限制。例如,某些實作禁止 null 元素,而某些實作則對元素的類型有限制。試圖添加不合格的元素會抛出未經檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢不合格的元素是否存在可能會抛出異常,也可能簡單地傳回 false;某些實作會采用前一種行為,而某些則采用後者。概括地說,試圖對不合格元素執行操作時,如果完成該操作後不會導緻在清單中插入不合格的元素,則該操作可能抛出一個異常,也可能成功,這取決于實作的選擇。此接口的規範中将這樣的異常标記為“可選”。

此接口是 Java Collections Framework 的成員

二:Set

一個不包含重複元素的 collection。更确切地講,set 不包含滿足

e1.equals(e2)

的元素對

e1

e2

,并且最多包含一個 null 元素。正如其名稱所暗示的,此接口模仿了數學上的 set 抽象。

    在所有構造方法以及 add、equals 和 hashCode 方法的協定上,Set 接口還加入了其他規定,這些規定超出了從 Collection 接口所繼承的内容。出于友善考慮,它還包括了其他繼承方法的聲明(這些聲明的規範已經專門針對 Set 接口進行了修改,但是沒有包含任何其他的規定)。

對這些構造方法的其他規定是(不要奇怪),所有構造方法必須建立一個不包含重複元素的 set(正如上面所定義的)。

  注:如果将可變對象用作 set 元素,那麼必須極其小心。如果對象是 set 中某個元素,以一種影響 equals 比較的方式改變對象的值,那麼 set 的行為就是不确定的。此項禁止的一個特殊情況是不允許某個 set 包含其自身作為元素。

      某些 set 實作對其所包含的元素有所限制。例如,某些實作禁止 null 元素,而某些則對其元素的類型所有限制。試圖添加不合格的元素會抛出未經檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢不合格的元素是否存在可能會抛出異常,也可能簡單地傳回 false;某些實作會采用前一種行為,而某些則采用後者。概括地說,試圖對不合格元素執行操作時,如果完成該操作後不會導緻在 set 中插入不合格的元素,則該操作可能抛出一個異常,也可能成功,這取決于實作的選擇。此接口的規範中将這樣的異常标記為“可選”。

此接口是 Java Collections Framework 的成員

三:Map

public interface Map<K,V>      

将鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。

此接口取代 Dictionary 類,後者完全是一個抽象類,而不是一個接口。

Map 接口提供三種collection 視圖,允許以鍵集、值集或鍵-值映射關系集的形式檢視某個映射的内容。映射順序 定義為疊代器在映射的 collection 視圖上傳回其元素的順序。某些映射實作可明確定證其順序,如 TreeMap 類;另一些映射實作則不保證順序,如 HashMap 類。

注:将可變對象用作映射鍵時必須格外小心。當對象是映射中某個鍵時,如果以影響 equals 比較的方式更改了對象的值,則映射的行為将是不确定的。此項禁止的一種特殊情況是不允許某個映射将自身作為一個鍵包含。雖然允許某個映射将自身作為值包含,但請格外小心:在這樣的映射上 equals 和 hashCode 方法的定義将不再是明确的。

所有通用的映射實作類應該提供兩個“标準的”構造方法:一個 void(無參數)構造方法,用于建立空映射;一個是帶有單個 Map 類型參數的構造方法,用于建立一個與其參數具有相同鍵-值映射關系的新映射。實際上,後一個構造方法允許使用者複制任意映射,生成所需類的一個等價映射。盡管無法強制執行此建議(因為接口不能包含構造方法),但是 JDK 中所有通用的映射實作都遵從它。

此接口中包含的“破壞”方法可修改其操作的映射,如果此映射不支援該操作,這些方法将抛出 UnsupportedOperationException。如果是這樣,那麼在調用對映射無效時,這些方法可以(但不要求)抛出 UnsupportedOperationException。例如,如果某個不可修改的映射(其映射關系是“重疊”的)為空,則對該映射調用

putAll(Map)

方法時,可以(但不要求)抛出異常。

某些映射實作對可能包含的鍵和值有所限制。例如,某些實作禁止 null 鍵和值,另一些則對其鍵的類型有限制。嘗試插入不合格的鍵或值将抛出一個未經檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢是否存在不合格的鍵或值可能抛出異常,或者傳回 false;某些實作将表現出前一種行為,而另一些則表現後一種。一般來說,試圖對不合格的鍵或值執行操作且該操作的完成不會導緻不合格的元素被插入映射中時,将可能抛出一個異常,也可能操作成功,這取決于實作本身。這樣的異常在此接口的規範中标記為“可選”。

此接口是 Java Collections Framework 的成員。

Collections Framework 接口中的很多方法是根據

equals

方法定義的。例如,

containsKey(Object key)

方法的規範中寫道:“當且僅當此映射包含針對滿足 (key==null ? k==null : key.equals(k)) 的鍵 k 的映射關系時,傳回 true”。不 應将此規範解釋為:調用具有非空參數 key 的 Map.containsKey 将導緻對任意的鍵 k 調用 key.equals(k)。實作可随意進行優化,以避免調用 equals,例如,可首先比較兩個鍵的哈希碼(

Object.hashCode()

規範保證哈希碼不相等的兩個對象不會相等)。一般來說,隻要實作者認為合适,各種 Collections Framework 接口的實作可随意利用底層

Object

方法的指定行為。

從以下版本開始: