語言

ICollection 介面

定義

集合 階層中的根介面。

[Android.Runtime.Register("java/util/Collection", "", "Java.Util.ICollectionInvoker")]
[Java.Interop.JavaTypeParameters(new System.String[] { "E" })]
public interface ICollection : IDisposable, Java.Interop.IJavaPeerable, Java.Lang.IIterable
[<Android.Runtime.Register("java/util/Collection", "", "Java.Util.ICollectionInvoker")>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "E" })>]
type ICollection = interface
    interface IIterable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
衍生
屬性
實作

備註

集合 階層中的根介面。 集合代表一組物件,稱為其 元素。 有些集合允許重複元素,有些則不允許。 有些是有序的,有些則是無序的。 具有明確遭遇順序的集合通常是介面的 SequencedCollection 子類型。 JDK 並未直接 實作此 介面:它提供更具體的子介面實作,如 Set 和 List。 此介面通常用於傳遞集合並操作,以達到最大程度的通用性。

袋 子或 多重集合 (可能包含重複元素的無序集合)應該直接實作此介面。

所有 Collection 通用實作類別(通常透過其子介面間接實作 Collection )都應該提供兩個「標準」建構子:一個空(無參數)建構子,建立空集合;另一個建構子只有一個型別 Collection為 的參數,該建構子建立與其參數相同元素的新集合。 實際上,後者的建構子允許使用者複製任何集合,產生等效的實作類型集合。 此慣例無法強制執行(因為介面不能包含建構子),但 Java 平台函式庫中所有通用Collection實作皆符合此規定。

某些方法被指定為 可選。 如果一個集合實作沒有實作特定操作,應該定義對應的方法來拋出 UnsupportedOperationException。 此類方法在集合介面的方法規範中標示為「可選操作」。

「optional-restrictions」>部分集合實作對其可包含的元素有限制。 例如,有些實作禁止空元素,有些則對元素的類型有限制。 嘗試加入不合格元素會拋出未檢查的例外,通常是 NullPointerException 或 ClassCastException。 嘗試查詢不合格元素的存在可能會拋出例外,或直接回傳 false;有些實作會呈現前者,有些則會呈現後者。 更一般來說,嘗試對一個不合格的元素進行操作,而該完成後不會將該不合格元素插入集合,可能會拋出例外,或在實作選擇下成功。 此類例外在此介面規範中標示為「可選」。

每個集合自行決定同步政策。 在實作缺乏更強保證的情況下,若在被其他執行緒變異的集合中呼叫任何方法,可能會導致未定義行為;這包括直接調用、將集合交給可能執行調用的方法,以及使用現有的迭代器檢查集合。

Collections Framework 的許多介面方法都是以該 Object#equals(Object) equals 方法來定義的。 例如,該 #contains(Object) contains(Object o) 方法的規範寫道:「回傳 true 當且僅當此集合包含至少一個 e 元素使得 (o==null ? e==null : o.equals(e))。」 此規範 不應 被解釋為使用 Collection.contains 非空參數 o 時,會對 o.equals(e) 任意元素 e被調用。 實作可自由實作優化,避免 equals 調用,例如先比較兩個元素的雜湊碼。 (規範 Object#hashCode() 保證兩個雜湊碼不相等的物件不可能相等。)更一般來說,各種集合框架介面的實作可自由利用底層 Object 方法的指定行為,視實作者認為適當而定。

某些執行遞迴遍歷集合的集合操作可能會失敗,但對於自指的實例,該集合直接或間接包含自身,則會失敗。 這包括 clone()、 equals()和 hashCode()toString() 方法。 實作可選擇性地處理自參情境,但大多數現行實作並未這麼做。

<h2>“view”查看>收藏/<h2>

大多數集合管理其所包含元素的儲存。 相較之下, 檢視集合 本身不儲存元素,而是依賴備份集合來儲存實際元素。 未由檢視集合本身處理的操作則委派給後備集合。 檢視集合的例子包括由 、 Collections#checkedCollection Collections.checkedCollection、 和 Collections#synchronizedCollection Collections.synchronizedCollection等方法Collections#unmodifiableCollection Collections.unmodifiableCollection回傳的包裝器集合。 其他視圖集合的例子包括提供相同元素不同表示的集合,例如由 List#subList List.subList、 NavigableSet#subSet NavigableSet.subSet、 Map#entrySet Map.entrySet、 SequencedCollection#reversed SequencedCollection.reversed或 提供。 對背景集合所做的任何變更都會在檢視集合中顯示。 相應地,對檢視集合所做的任何變更 & mdash;如果允許更改,且 mdash;會寫入背景收藏。 雖然技術上它們不是集合,但實例 Iterator 和 ListIterator 也可以允許修改寫入後備集合,且在某些情況下,迭代者在迭代過程中會看到後備集合的修改。

<h2>「不可修改」不可修改集合>/<h2>

此介面的某些方法被視為「破壞性」,稱為「變異器」方法,因為它們修改了所操作集合中包含的物件群組。 如果這個收集實作不支援該操作,可以指定拋出 UnsupportedOperationException 它們。 如果調用對集合沒有影響,這些方法應該(但非必須)拋出 。UnsupportedOperationException 例如,考慮一個不支援該操作的 #add add 集合。 如果在這個集合上呼叫該 #addAll addAll 方法,且參數是空集合,會發生什麼事? 加入零元素不會產生影響,因此這個集合可以直接不做任何事,也不拋出例外。 然而,建議此類情況應無條件拋出例外,因為僅在某些情況下拋出例外可能導致程式錯誤。

不可修改的集合是指所有變異子方法(如上定義)都指定以拋出 UnsupportedOperationException。 因此,這樣的集合無法透過呼叫任何方法來修改。 要讓一個集合真正不可修改,任何從它衍生出的檢視集合也必須是不可修改的。 例如,如果一個清單是不可修改的,那麼所返回的 List#subList List.subList 清單也同樣不可修改。

不可修改的集合不一定是不變的。 若所包含元素可變,整個集合顯然是可變的,儘管它可能不可修改。 例如,考慮兩個包含可變元素的不可修改清單。 如果元素被變異,呼叫 list1.equals(list2) 結果可能會因呼叫而異,儘管兩個列表都無法修改。 然而,如果一個不可修改的集合包含所有不可變元素,則可視為有效不變的。

<h2>“unmodview”>不可修改 View Collections</h2>

不可修改的檢視集合是指不可修改的集合,同時也是指向後置集合的檢視。 其變異器方法如前所述拋出 UnsupportedOperationException,而讀取與查詢方法則委派給後方集合。 其效果是提供對備份集合的唯讀存取。 這對於元件提供使用者對內部集合的讀取權限,同時防止他們意外修改此類集合非常有用。 不可修改的視圖集合範例包括由 Collections#unmodifiableCollection Collections.unmodifiableCollection、 Collections#unmodifiableList Collections.unmodifiableList及相關方法回傳的集合。

請注意,備份集合仍有可能變更,若有變更,則透過不可修改視圖可見。 因此,不可修改的視圖集合不一定是不變的。 然而,如果不可修改視圖的後盾集合實際上是不可變的,或唯一透過不可修改的視圖來參考該後盾集合,則該視圖可視為實質不變。

<h2>“可序列化”>集合的<序列化能力/h2>

集合的序列化是可選擇的。 因此,沒有任何集合介面被宣告來實作該 java.io.Serializable 介面。 然而,序列化普遍被認為是有用的,因此大多數集合實作都是可序列化的。

若集合實作為公開類別(如 ArrayList 或 HashMap),且實際上可序列化,則宣告為實作該 Serializable 介面。 有些集合實作不是公開類別,例如不可修改的集合。 在這種情況下,這些集合的序列化可性會在建立它們的方法規範中,或其他適當的地方說明。 若未明確指定集合的序列化可行性,則無法保證該集合的序列化。 特別是,許多檢視集合無法序列化,即使原始集合是可序列化的。

實作 Serializable 介面的集合實作無法保證可序列化。 原因是一般來說,集合包含其他類型的元素,且無法靜態判斷某元素類型的實例是否真的可序列化。 例如,考慮一個可 Collection<E>序列化的 ,其中 E 並未實作 該 Serializable 介面。 若集合僅包含某個可序列化子類型的 E元素,或為空集合,則可能是可序列化的。 因此,集合被稱為 條件序列化, 因為整個集合的序列化程度取決於集合本身是否可序列化,以及所有包含的元素是否也可序列化。

另一個情況發生在 和 的SortedSetSortedMap實例中。 這些集合可以用 來 Comparator 建立,對集合元素或映射鍵施加排序。 此類集合僅在所提供的 Comparator 也可序列化時才可序列化。

此介面是 Java 集合框架的成員。

在 1.2 版本中加入。

Java 文件 java.util.Collection。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

屬性

名稱 Description
Handle

取得底層 Android 物件的 JNI 值。

(繼承來源 IJavaObject)
IsEmpty

若此處Collection不包含任何元素,則回傳true。

JniIdentityHashCode

回傳包裹實例的 java.lang.System.identityHashCode() 值。

(繼承來源 IJavaPeerable)
JniManagedPeerState

管理貴族的狀況。

(繼承來源 IJavaPeerable)
JniObjectReferenceControlBlock

集合 階層中的根介面。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取與召喚支援。

(繼承來源 IJavaPeerable)
PeerReference

回傳JniObjectReference包裹後的 Java 物件實例。

(繼承來源 IJavaPeerable)

方法

名稱 Description
Add(Object)

確保此集合包含指定的元素(可選操作)。

AddAll(ICollection)

將指定集合中的所有元素加入此集合(可選操作)。

Clear()

移除此集合中的所有元素(可選操作)。

Contains(Object)

若此集合包含指定元素,則回傳 true 。

ContainsAll(ICollection)

若此集合包含指定集合中的所有元素,則回傳 true 。

Disposed()

當實例被處理後才被召喚。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果沒有未解決的參考資料,則 Dispose()呼叫;否則,則不做任何事。

(繼承來源 IJavaPeerable)
Equals(Object)

比較指定物件與此集合以求相等。

Finalized()

當實例完成後才會被通知。

(繼承來源 IJavaPeerable)
ForEach(IConsumer)

對每個元素 Iterable 執行指定動作,直到所有元素都處理完畢或動作拋出異常。

(繼承來源 IIterable)
GetHashCode()

回傳此集合的雜湊碼值。

Iterator()

回傳該集合中元素的迭代器。

Remove(Object)

若該集合存在,則移除該集合中單一的實例(可選操作)。

RemoveAll(ICollection)

移除該集合中所有同時包含於指定集合中的元素(可選操作)。

RemoveIf(IPredicate)

移除該集合中所有滿足該謂詞的元素(可選操作)。

RetainAll(ICollection)

只保留該集合中包含於指定集合中的元素(可選操作)。

SetJniIdentityHashCode(Int32)

將回傳的值設為 JniIdentityHashCode。

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

集合 階層中的根介面。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

將回傳的值設為 PeerReference。

(繼承來源 IJavaPeerable)
Size()

回傳此集合中的元素數量。

Spliterator()

在由此Spliterator描述的元素上建立 a Iterable 。

(繼承來源 IIterable)
ToArray()

回傳包含此集合中所有元素的陣列。

ToArray(IIntFunction)

回傳包含此集合中所有元素的陣列,並使用所提供的 generator 函式來分配回傳的陣列。

ToArray(Object[])

回傳包含此集合中所有元素的陣列;回傳陣列的執行時型別即為指定陣列的類型。

UnregisterFromRuntime()

取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。

(繼承來源 IJavaPeerable)

明確介面實作

名稱 Description
IIterable.Spliterator()

在此集合中建立 元素 Spliterator 。

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

集合 階層中的根介面。

ToEnumerable(IIterable)

回傳 和 IEnumerable ,會對 Java IIterable進行迭代,允許 foreach 和 LINQ 與 Java 集合類型一起使用。 每個元素都會從其 Java 實例編組到對應的受管理型別。

ToEnumerable<T>(IIterable)

回傳 和 IEnumerable<T> ,該 在 Java IIterable上迭代,將每個元素 集結為 T。 這使得 foreach LINQ 可以搭配 Java 集合類型一起使用。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於