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 (沒有自變數) 建構函式,其會建立空集合,以及具有類型單一自變數的建構函式,其會建立與自變數 Collection
相同的元素的新集合。 實際上,後者建構函式可讓用戶複製任何集合,產生所需實作類型的對等集合。 無法強制執行此慣例 (,因為介面不能包含建構函式) ,但 Java 平台連結庫中的所有一般用途 Collection
實作都符合規範。
某些方法會指定為 選擇性方法。 如果集合實作未實作特定作業,它應該定義要擲 UnsupportedOperationException
回的對應方法。 這類方法在集合介面的方法規格中標示為「選擇性作業」。
「選擇性限制」>某些集合實作對可能包含的專案有限制。 例如,某些實作會禁止 Null 元素,有些實作會限制其元素的類型。 嘗試加入不符合資格的項目會擲回未核取的例外狀況,通常是 NullPointerException
或 ClassCastException
。 嘗試查詢不符合資格的專案是否存在可能會擲回例外狀況,或可能只傳回 false;有些實作會展示先前的行為,有些則會展示後者。 更通常,嘗試在不符合資格的元素上嘗試作業,其完成並不會在集合中插入不符合資格的專案,可能會擲回例外狀況,否則可能會在實作的選項中成功。 這類例外狀況會在此介面的規格中標示為「選擇性」。
每個集合最多可以判斷自己的同步處理原則。 如果實作沒有更強的保證,未定義的行為可能會因為另一個線程所變動的集合上叫用任何方法所造成;這包括直接調用、將集合傳遞至可能執行調用的方法,以及使用現有的反覆運算器來檢查集合。
集合架構介面中的許多方法都是以 方法為基礎 Object#equals(Object) equals
來定義。 例如,方法的#contains(Object) contains(Object o)
規格指出:「只有在這個集合包含至少一個元素e
時,才會傳回 ,如此才會(o==null ? e==null : o.equals(e))
傳回 true
。」 此規格不應有任何影響,Collection.contains
以表示叫用非 Null 自變數o
的叫用會導致o.equals(e)
針對任何專案e
叫用 。 實作可以自由實作優化 equals
,例如,先比較兩個元素的哈希碼,藉此避免叫用。 (規格 Object#hashCode()
保證具有不相等哈希碼的兩個物件不相等。) 較通常,各種 Collections Framework 介面的實作可以自由利用實作者認為適當的基礎 Object
方法指定行為。
執行集合遞歸周游的某些集合作業可能會失敗,但集合直接或間接包含本身之自我參考實例的例外狀況。 clone()
這包括、 equals()
hashCode()
和 toString()
方法。 實作可以選擇性地處理自我參考案例,不過大部分的實作都不會這麼做。
<h2>“view”>View Collections</h2>
大部分的集合都會管理其包含之項目的記憶體。 相反地, 檢視集合 本身不會儲存元素,而是依賴備份集合來儲存實際元素。 檢視集合本身未處理的作業會委派給備份集合。 檢視集合的範例包括、 Collections#synchronizedCollection Collections.synchronizedCollection
和 Collections#unmodifiableCollection Collections.unmodifiableCollection
等Collections#checkedCollection Collections.checkedCollection
方法所傳回的包裝函式集合。 檢視集合的其他範例包括提供相同元素的不同表示法的集合,例如, 或Map#entrySet Map.entrySet
所提供的 List#subList List.subList
NavigableSet#subSet NavigableSet.subSet
。 對備份集合所做的任何變更,皆會顯示在檢視集合中。 對應地,對檢視集合所做的任何變更 —如果 &mdash 允許變更,則為 ;會透過寫入備份集合。 雖然它們在技術上不是集合,但是 和 ListIterator
的實例Iterator
也可以允許修改寫入備份集合,在某些情況下,反覆運算器會顯示對備份集合的修改。
<h2>“unmodifiable”>Unmodifiable Collections</h2>
此介面的某些方法會被視為「破壞性」,而且稱為「變動子」方法,因為它們會修改其運作所在集合內含的物件群組。 如果這個集合實作不支援作業,則可以指定它們來擲回 UnsupportedOperationException
。 如果叫用不會影響集合,則這類方法應該 (,但不需要) 擲 UnsupportedOperationException
回 。 例如,請考慮不支援作業的 #add add
集合。 如果在 #addAll addAll
這個集合上叫用 方法,並將空的集合當做 自變數,會發生什麼事? 加入零個元素沒有任何作用,因此此集合只允許不執行任何動作,而不會擲回例外狀況。 不過,建議這類案例無條件地擲回例外狀況,因為只有在特定情況下擲回可能會導致程序設計錯誤。
無法修改的集合是集合,其所有 mutator 方法 (如上述定義,) 指定為擲回 UnsupportedOperationException
。 因此,無法藉由在它上呼叫任何方法來修改這類集合。 若要讓集合正確不可修改,任何衍生自該集合的檢視集合也必須不可修改。 例如,如果 List 是不可修改的,則 所 List#subList List.subList
傳回的清單也是不可修改的。
不可修改的集合不一定不可變。 如果包含的專案是可變動的,則即使整個集合可能不可修改,整個集合仍可清楚變動。 例如,請考慮包含可變動元素的兩個不可修改清單。 如果元素已變動,呼叫的結果 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
會發生額外的案例。 您可以使用對 set 元素或 map 索引鍵施加排序的 來建立 Comparator
這些集合。 只有當提供的 Comparator
也是可串行化時,才能串行化這類集合。
這個介面是 Java Collections Framework 的成員。
已在1.2中新增。
此頁面的部分是根據 所建立和共用的工作進行修改,並根據 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) |
集合階層中的根介面。 |