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
- 衍生
- 屬性
- 實作
備註
集合階層中的根介面。 集合代表一組物件,稱為其 專案。 某些集合允許重複的專案,而其他集合則不允許。 有些是已排序的,有些則未排序。 JDK 不提供此介面的任何直接實作:它提供和 等Set
List
更特定子介面的實作。 此介面通常用來傳遞集合,並在需要最大一般性的情況下操作集合。
包 或 多集 (可能包含重複專案的未排序集合)應該直接實作這個介面。
所有一般用途 Collection
實作類別(通常透過其中一個子介面間接實 Collection
作)都應該提供兩個「標準」建構函式:void (no arguments) 建構函式,它會建立空集合,以及具有類型 Collection
單一自變數的建構函式,其會建立與自變數相同的元素的新集合。 實際上,後者的建構函式可讓用戶複製任何集合,產生所需實作類型的對等集合。 無法強制執行此慣例(因為介面不能包含建構函式),但 Java 平台連結庫中的所有一般用途 Collection
實作都符合規範。
某些方法會指定為 選擇性方法。 如果集合實作未實作特定作業,它應該定義要擲回 UnsupportedOperationException
的對應方法。 這類方法在集合介面的方法規格中標示為「選擇性作業」。
「選擇性限制」>某些集合實作對可能包含的專案有限制。 例如,某些實作會禁止 Null 元素,有些實作會限制其元素的類型。 嘗試加入不符合資格的項目會擲回未核取的例外狀況,通常是 NullPointerException
或 ClassCastException
。 嘗試查詢不符合資格的專案是否存在可能會擲回例外狀況,或者可能只傳回 false;有些實作會展示先前的行為,有些則會呈現後者。 更一般而言,嘗試在不符合資格的元素上執行作業,其完成不會導致將不合格專案插入集合可能會擲回例外狀況,或者可能會在實作的選項中成功。 此介面的規格中會將這類例外狀況標示為「選擇性」。
每個集合最多可以判斷自己的同步處理原則。 如果沒有實作更強的保證,未定義的行為可能會因為另一個線程正在變動的集合上叫用任何方法所造成;這包括直接調用、將集合傳遞至可能執行調用的方法,以及使用現有的反覆運算器來檢查集合。
集合架構介面中的許多方法都是以 方法來 Object#equals(Object) equals
定義。 例如,方法的#contains(Object) contains(Object o)
規格會指出:「只有在這個集合包含至少一個專案e
時,才會傳回 true
。(o==null ? e==null : o.equals(e))
」 此規格不應解釋為暗示Collection.contains
叫用非 Null 自變數o
會導致o.equals(e)
針對任何項目e
叫用 。 實作可以自由實作優化 equals
,例如,藉由先比較兩個元素的哈希碼,避免叫用。 (規格 Object#hashCode()
保證具有不相等哈希碼的兩個物件不能相等。一般而言,各種 Collections Framework 介面的實作,只要實作者認為適當,就能夠利用基礎 Object
方法的指定行為。
某些執行集合遞歸周游的集合作業可能會失敗,但直接或間接包含集合本身之自我參考實例的例外狀況。 這包括clone()
、 equals()
hashCode()
和 toString()
方法。 實作可能會選擇性地處理自我參考案例,不過大部分的目前實作不會這麼做。
<h2>“view”>View Collections</h2>
大部分的集合都會管理其包含之元素的記憶體。 相反地, 檢視集合 本身不會儲存專案,而是依賴備份集合來儲存實際元素。 檢視集合本身未處理的作業會委派給備份集合。 檢視集合的範例包括、、 和 Collections#unmodifiableCollection Collections.unmodifiableCollection
等Collections#checkedCollection Collections.checkedCollection
Collections#synchronizedCollection Collections.synchronizedCollection
方法所傳回的包裝函式集合。 檢視集合的其他範例包括提供相同專案之不同表示的集合,例如 , 或Map#entrySet Map.entrySet
所提供的 List#subList List.subList
NavigableSet#subSet NavigableSet.subSet
。 檢視集合中可以看到對備份集合所做的任何變更。 對應地,對檢視集合和 mdash 所做的任何變更;如果允許變更 ,則為 ;如果允許變更則為 ;會透過寫入備份集合。 雖然它們在技術上不是集合,但是 和 ListIterator
的Iterator
實例也可以允許修改寫入備份集合,在某些情況下,反覆運算器會顯示對備份集合的修改。
<h2>“unmodifiable”>Unmodifiable Collections</h2>
這個介面的某些方法會被視為「破壞性」,且稱為「Mutator」方法,因為它們會修改其操作所在集合內所包含的物件群組。 如果這個集合實作不支援作業,則可以指定它們來擲回 UnsupportedOperationException
。 如果叫用對集合沒有任何影響,則這類方法應該會擲回 UnsupportedOperationException
,但不需要。 例如,請考慮不支援作業的 #add add
集合。 如果在 #addAll addAll
這個集合上叫用 方法,並將空集合當做 自變數,會發生什麼事? 加入零個元素沒有任何作用,因此這個集合只允許不執行任何動作,而不會擲回例外狀況。 不過,建議這類案例無條件擲回例外狀況,因為只在特定情況下擲回可能會導致程序設計錯誤。
無法修改的集合是集合,其所有 Mutator 方法(如上所述)都會指定來擲回 UnsupportedOperationException
。 因此,無法藉由呼叫任何方法來修改這類集合。 若要讓集合正確不可修改,衍生自它的任何檢視集合也必須不可修改。 例如,如果 List 是不可修改的,則 所 List#subList List.subList
傳回的 List 也是不可修改的。
不可修改的集合不一定不可變。 如果包含的專案是可變的,則整個集合顯然是可變動的,即使它可能不可修改。 例如,請考慮包含可變動元素的兩個不可修改清單。 如果元素已變動,呼叫的結果 list1.equals(list2)
可能會與下一個呼叫不同,即使這兩個清單都是不可修改的。 不過,如果不可修改的集合包含所有不可變的元素,它可以被視為有效不可變。
<h2>“unmodview”>Unmodifiable View Collections</h2>
不可修改的檢視集合是不可修改的集合,也是備份集合的檢視。 其 Mutator 方法會擲回 UnsupportedOperationException
,如上所述,而讀取和查詢方法則會委派給備份集合。 效果是提供備份集合的唯讀存取權。 這適用於元件為使用者提供內部集合的讀取許可權,同時防止使用者意外修改這類集合。 不可修改檢視集合的範例是、 Collections#unmodifiableList Collections.unmodifiableList
和相關方法所Collections#unmodifiableCollection Collections.unmodifiableCollection
傳回的集合。
請注意,可能仍然可以變更備份集合,而且如果發生變更,它們就會透過不可修改的檢視來看見。 因此,不可修改的檢視集合不一定不可變。 不過,如果不可修改檢視的備份集合實際上是不可變的,或如果備份集合的唯一參考是透過不可修改的檢視,則檢視可以有效地視為不可變。
<h2>“serializable”>Collections</h2 的串行化性>
集合的串行化性是選擇性的。 因此,不會宣告任何集合介面來實 java.io.Serializable
作 介面。 不過,串行化性被視為一般有用,因此大部分的集合實作都是可串行化的。
公用類別的集合實作會ArrayList
HashMap
宣告為Serializable
實作 介面,如果它們實際上是可串行化的。 某些集合實作不是公用類別,例如不可修改的集合。 在這種情況下,這類集合的可串行化性會描述於建立集合的方法規格,或在某些其他適當位置。 如果未指定集合的可串行化性,則無法保證這類集合的串行化性。 特別是,許多檢視集合無法串行化。
實作 介面的 Serializable
集合實作無法保證可串行化。 原因是一般而言,集合包含其他類型的專案,而且無法以靜態方式判斷某些專案類型的實例是否實際可串行化。 例如,請考慮可 Collection<E>
串行化的 ,其中 E
不會實作 Serializable
介面。 如果集合只包含某些可串行化子類型的 E
專案,或它是空的,則集合可以串行化。 因此,集合會 以條件方式串行化, 因為整個集合的串行化性取決於集合本身是否可串行化,以及所有包含的專案是否也是可串行化的。
和實例SortedSet
SortedMap
發生其他情況。 您可以使用 對集合項目或對應索引鍵施加排序的 來建立 Comparator
這些集合。 只有當提供的 Comparator
也是可串行化時,這類集合才可串行化。
這個介面是 Java Collections Framework 的成員。
已在1.2中新增。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
屬性
Handle |
取得基礎 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
IsEmpty |
如果不包含 |
JniIdentityHashCode |
傳回包裝實例的 值 |
JniManagedPeerState |
受控對等的狀態。 (繼承來源 IJavaPeerable) |
JniPeerMembers |
成員存取和調用支援。 (繼承來源 IJavaPeerable) |
PeerReference |
傳 JniObjectReference 回已包裝 Java 物件實例的 。 (繼承來源 IJavaPeerable) |
方法
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) |
明確介面實作
IIterable.Spliterator() |
在 |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
集合階層中的根介面。 |
GetJniTypeName(IJavaPeerable) |
集合階層中的根介面。 |
ToEnumerable(IIterable) |
集合階層中的根介面。 |
ToEnumerable<T>(IIterable) |
集合階層中的根介面。 |