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 不提供此接口的任何直接实现:它提供更具体的子接口(如 和 List
)Set
的实现。 此接口通常用于传递集合,并在需要最大通用性时对其进行操作。
包或多重集 (可能包含重复元素的无序集合) 应直接实现此接口。
所有常规用途 Collection
实现类 (通常通过其子接口之一间接实现 Collection
) 应提供两个“标准”构造函数:void (无参数) 构造函数(用于创建空集合)和具有单个类型 Collection
参数的构造函数(使用与其参数相同的元素创建新集合)。 实际上,后一个构造函数允许用户复制任何集合,从而生成所需实现类型的等效集合。 无法 (强制实施此约定,因为接口不能包含构造函数) 但 Java 平台库中的所有常规用途 Collection
实现都符合要求。
某些方法被指定为 可选方法。 如果集合实现未实现特定操作,则应定义相应的方法以引发 UnsupportedOperationException
。 此类方法在集合接口的方法规范中被标记为“可选操作”。
“optional-restrictions”>某些集合实现对可能包含的元素有限制。 例如,某些实现禁止 null 元素,而某些实现对其元素的类型有限制。 尝试添加不合格的元素会引发未检查的异常,通常 NullPointerException
为 或 ClassCastException
。 尝试查询是否存在不合格的元素可能会引发异常,或者可能只返回 false;某些实现将显示前一种行为,而某些实现将显示后者。 更一般地说,尝试对不符合条件的元素执行操作,而该元素的完成不会导致将不合格元素插入到集合中,可能会引发异常,也可能在 实现选项处成功。 此类异常在此接口的规范中标记为“可选”。
由每个集合决定其自己的同步策略。 在实现没有更强的保证的情况下,未定义的行为可能是由于调用另一个线程正在改变的集合上的任何方法而引起的;这包括直接调用、将集合传递给可能执行调用的方法,以及使用现有迭代器检查集合。
集合框架接口中的许多方法都是根据 Object#equals(Object) equals
方法定义的。 例如, 方法的 #contains(Object) contains(Object o)
规范显示:“ true
当并且仅当此集合包含至少一个元素 e
时,返回 。 (o==null ? e==null : o.equals(e))
” 不应将此规范解释为暗示使用非 null 参数o
调用Collection.contains
将导致o.equals(e)
为任何元素 e
调用。 实现可以自由实现优化, equals
从而避免调用,例如,首先比较两个元素的哈希代码。 (规范 Object#hashCode()
保证具有不相等哈希代码的两个对象不能相等。) 更一般地说,各种集合框架接口的实现可以自由地利用基础 Object
方法的指定行为,只要实现者认为合适。
某些对集合执行递归遍历的集合操作可能会失败,而对于集合直接或间接包含自身的自引用实例,则异常。 这包括 clone()
、 equals()
hashCode()
和 toString()
方法。 实现可以选择性地处理自引用方案,但大多数当前实现不会这样做。
<h2>“view”>View Collections</h2>
大多数集合管理其包含的元素的存储。 相比之下, 视图集合 本身不存储元素,而是依赖于后备集合来存储实际元素。 视图集合本身未处理的操作将委托给后备集合。 视图集合的示例包括 、、 和 Collections#unmodifiableCollection Collections.unmodifiableCollection
等Collections#checkedCollection Collections.checkedCollection
Collections#synchronizedCollection Collections.synchronizedCollection
方法返回的包装器集合。 视图集合的其他示例包括提供相同元素的不同表示形式的集合,例如 ,由 List#subList List.subList
、 NavigableSet#subSet NavigableSet.subSet
或 Map#entrySet Map.entrySet
提供。 对后备集合所做的任何更改在视图集合中可见。 相应地,对视图集合所做的任何更改 —如果允许更改 —将写入后备集合。 虽然它们在技术上不是集合,但 和 ListIterator
的Iterator
实例也可以允许将修改写入支持集合,在某些情况下,迭代器将看到对后备集合的修改。
<h2>“unmodifiable”>Unmodifiable Collections</h2>
此接口的某些方法被视为“破坏性”,称为“互变器”方法,因为它们修改其操作所在的集合中包含的对象组。 如果此集合实现不支持操作,则可以将其指定为引发 UnsupportedOperationException
。 如果调用对集合没有影响,则此类方法应 (但不需要) 引发 UnsupportedOperationException
。 例如,假设有一个不支持 操作的 #add add
集合。 如果 #addAll addAll
在此集合上调用 方法,并将空集合作为参数,会发生什么情况? 添加零个元素不起作用,因此允许此集合不执行任何操作,并且不引发异常。 但是,建议此类情况无条件地引发异常,因为仅在某些情况下引发会导致编程错误。
不可修改的集合是一个集合,其所有变量方法 (如上所述) 指定来引发 UnsupportedOperationException
。 因此,无法通过调用任何方法来修改此类集合。 要使集合正确不可修改,派生自该集合的任何视图集合也必须不可修改。 例如,如果 List 不可修改,则返回 List#subList List.subList
的列表也是不可修改的。
不可修改的集合不一定是不可变的。 如果包含的元素是可变的,则整个集合显然是可变的,即使它可能是不可修改的。 例如,假设两个包含可变元素的不可修改列表。 如果元素已发生更改,则调用 list1.equals(list2)
的结果可能与下一个调用不同,即使这两个列表都是不可修改的。 但是,如果不可修改的集合包含所有不可变元素,则可以认为它实际上不可变。
<h2>“unmodview”>不可修改的视图集合</h2>
不可修改的视图集合是不可修改的集合,也是支持集合的视图。 如上所述,其可变器方法引发 UnsupportedOperationException
,而读取和查询方法委托给后备集合。 其效果是提供对后备集合的只读访问权限。 这对于组件非常有用,可为用户提供对内部集合的读取访问权限,同时防止他们意外修改此类集合。 不可修改视图集合的示例是由 、 Collections#unmodifiableList Collections.unmodifiableList
和相关方法返回Collections#unmodifiableCollection Collections.unmodifiableCollection
的视图集合。
请注意,对后备集合的更改可能仍然可行,如果发生更改,则可通过不可修改的视图查看这些更改。 因此,不可修改的视图集合不一定是不可变的。 但是,如果不可修改视图的后备集合实际上是不可变的,或者对支持集合的唯一引用是通过不可修改的视图,则可以认为该视图实际上不可变。
<h2>“serializable”>Collections</h2 的 Serializability>
集合的可序列化性是可选的。 因此,不会声明任何集合接口来实现 接口 java.io.Serializable
。 但是,可序列化性被视为通常有用,因此大多数集合实现都是可序列化的。
声明作为公共类 (或 HashMap
) Serializable
等ArrayList
集合实现来实现接口(如果它们实际上是可序列化的)。 某些集合实现不是公共类,例如不可修改的集合。 在这种情况下,此类集合的可序列化性在创建这些集合的方法的规范中或在某个其他适当位置进行了说明。 如果未指定集合的可序列化性,则无法保证此类集合的可序列化性。 具体而言,许多视图集合不可序列化。
无法保证实现 接口的 Serializable
集合实现可序列化。 原因是集合通常包含其他类型的元素,并且无法静态确定某些元素类型的实例是否实际可序列化。 例如,请考虑可 Collection<E>
序列化的 ,其中 E
不实现 Serializable
接口。 如果集合仅包含 的某些可序列化子类型的 元素,或者如果集合为空,则集合可能是可序列化的 E
。 因此,集合可以说是 有条件的可序列化的, 因为集合作为一个整体的可序列化性取决于集合本身是否可序列化,以及是否所有包含的元素也可以序列化。
另一种情况发生在 和 SortedMap
的SortedSet
实例中。 可以使用 对集元素或映射键施加排序的 来创建 Comparator
这些集合。 仅当提供的 Comparator
也是可序列化的 时,此类集合才可序列化。
此接口是 Java 集合框架的成员。
在 1.2 中添加。
的 java.util.Collection
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
属性
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) |
集合层次结构中的根接口。 |