ICollection 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
集合 階層中的根介面。
[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 版本中加入。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
屬性
| 名稱 | Description |
|---|---|
| Handle |
取得底層 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
| IsEmpty |
若此處 |
| JniIdentityHashCode |
回傳包裹實例的 |
| JniManagedPeerState |
管理貴族的狀況。 (繼承來源 IJavaPeerable) |
| JniObjectReferenceControlBlock |
集合 階層中的根介面。 (繼承來源 IJavaPeerable) |
| JniPeerMembers |
成員存取與召喚支援。 (繼承來源 IJavaPeerable) |
| PeerReference |
回傳JniObjectReference包裹後的 Java 物件實例。 (繼承來源 IJavaPeerable) |
方法
| 名稱 | Description |
|---|---|
| Add(Object) |
確保此集合包含指定的元素(可選操作)。 |
| AddAll(ICollection) |
將指定集合中的所有元素加入此集合(可選操作)。 |
| Clear() |
移除此集合中的所有元素(可選操作)。 |
| Contains(Object) |
若此集合包含指定元素,則回傳 |
| ContainsAll(ICollection) |
若此集合包含指定集合中的所有元素,則回傳 |
| Disposed() |
當實例被處理後才被召喚。 (繼承來源 IJavaPeerable) |
| DisposeUnlessReferenced() |
如果沒有未解決的參考資料,則 |
| Equals(Object) |
比較指定物件與此集合以求相等。 |
| Finalized() |
當實例完成後才會被通知。 (繼承來源 IJavaPeerable) |
| ForEach(IConsumer) |
對每個元素 |
| GetHashCode() |
回傳此集合的雜湊碼值。 |
| Iterator() |
回傳該集合中元素的迭代器。 |
| Remove(Object) |
若該集合存在,則移除該集合中單一的實例(可選操作)。 |
| RemoveAll(ICollection) |
移除該集合中所有同時包含於指定集合中的元素(可選操作)。 |
| RemoveIf(IPredicate) |
移除該集合中所有滿足該謂詞的元素(可選操作)。 |
| RetainAll(ICollection) |
只保留該集合中包含於指定集合中的元素(可選操作)。 |
| SetJniIdentityHashCode(Int32) |
將回傳的值設為 |
| SetJniManagedPeerState(JniManagedPeerStates) |
集合 階層中的根介面。 (繼承來源 IJavaPeerable) |
| SetPeerReference(JniObjectReference) |
將回傳的值設為 |
| Size() |
回傳此集合中的元素數量。 |
| Spliterator() |
在由此 |
| ToArray() |
回傳包含此集合中所有元素的陣列。 |
| ToArray(IIntFunction) |
回傳包含此集合中所有元素的陣列,並使用所提供的 |
| ToArray(Object[]) |
回傳包含此集合中所有元素的陣列;回傳陣列的執行時型別即為指定陣列的類型。 |
| UnregisterFromRuntime() |
取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。 (繼承來源 IJavaPeerable) |
明確介面實作
| 名稱 | Description |
|---|---|
| IIterable.Spliterator() |
在此集合中建立 元素 |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
集合 階層中的根介面。 |
| ToEnumerable(IIterable) |
回傳 和 IEnumerable ,會對 Java IIterable進行迭代,允許 |
| ToEnumerable<T>(IIterable) |
回傳 和 IEnumerable<T> ,該 在 Java IIterable上迭代,將每個元素 集結為 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |