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)
规范显示:“仅当此集合包含至少一个元素时,才会返回 true
该元素 e
。 (o==null ? e==null : o.equals(e))
” 不应解释此规范,以暗示对任何元素e
调用使用非 null 参数o
的调用Collection.contains
将导致o.equals(e)
调用。 实现可以自由实现优化 equals
,例如,通过首先比较两个元素的哈希代码来避免调用。 (该 Object#hashCode()
规范保证具有不相等哈希代码的两个对象不能相等。更普遍的是,无论实现者认为它合适,都能自由地利用基础 Object
方法的指定行为。
某些执行递归遍历集合的集合操作可能会失败,但对于直接或间接包含集合本身的自引用实例,可能会失败。 这包括clone()
和 equals()
hashCode()
toString()
方法。 实现可以选择性地处理自引用方案,但大多数当前实现不这样做。
<h2>“view”>View Collections</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
或提供。 对后盾集合所做的任何更改在视图集合中都可见。 相应地,对视图集合和 mdash 所做的任何更改;如果允许更改 ,则为 Iterator
也可以允许修改写入支持集合,在某些情况下,对支持集合的修改将在迭代过程中对迭代器可见。
<h2>“unmodifiable”>Unmodifiable Collections</h2>
此接口的某些方法被视为“破坏性”,称为“mutator”方法,因为它们修改了在其上运行的集合中包含的对象组。 如果此集合实现不支持该操作,则可以指定它们引发 UnsupportedOperationException
。 如果调用对集合没有影响,则此类方法应(但不需要)引发 UnsupportedOperationException
。 例如,请考虑不支持该操作的 #add add
集合。 如果 #addAll addAll
对此集合调用该方法,将空集合作为参数,会发生什么情况? 添加零个元素不起作用,因此此集合只执行任何操作而不引发异常是允许的。 但是,建议此类情况无条件引发异常,因为仅在某些情况下引发可能会导致编程错误。
不可修改的集合是一个集合,其所有变量方法(如上所述)都指定为引发UnsupportedOperationException
。 因此,无法通过调用任何方法来修改此类集合。 要使集合正确不可修改,派生自该集合的任何视图集合也必须不可修改。 例如,如果列表不可修改,则返回的列表 List#subList List.subList
也是不可修改的。
不可修改的集合不一定是不可变的。 如果包含的元素是可变的,则整个集合显然是可变的,即使它可能不可修改。 例如,假设有两个包含可变元素的不可修改列表。 如果元素已改变,则调用 list1.equals(list2)
的结果可能与下一个调用不同,即使这两个列表都是不可修改的。 但是,如果不可修改的集合包含所有不可变元素,则可以将其视为有效不可变。
<h2>“unmodview”>Unmodifiable View Collections</h2>
不可修改的视图集合是不可修改的集合,也是支持集合的视图。 其可变器方法会引发 UnsupportedOperationException
,如上所述,而读取和查询方法将委托给支持集合。 效果是提供对后盾集合的只读访问权限。 这对于组件为用户提供对内部集合的读取访问权限非常有用,同时防止用户意外修改此类集合。 不可修改的视图集合的示例包括由 Collections#unmodifiableCollection Collections.unmodifiableCollection
相关 Collections#unmodifiableList Collections.unmodifiableList
方法和相关方法返回的集合。
请注意,对后盾集合的更改可能仍可能,如果发生更改,则可以通过不可修改的视图查看它们。 因此,不可修改的视图集合不一定是不可变的。 但是,如果不可修改视图的后备集合实际上是不可变的,或者如果对后备集合的唯一引用是通过不可修改的视图,则可以将视图视为有效不可变的。
<h2>“serializable”>Collections</h2 的可序列化性>
集合的可序列化性是可选的。 因此,未声明任何集合接口来实现 java.io.Serializable
接口。 但是,可序列化性被视为一般有用,因此大多数集合实现都是可序列化的。
公共类(如 ArrayList
或 HashMap
)的集合实现声明为实现 Serializable
接口(如果它们实际上是可序列化的)。 某些集合实现不是公共类,例如不可修改的集合。 在这种情况下,此类集合的可序列化性在创建集合的方法的规范中或在某些其他合适的位置进行描述。 如果未指定集合的可序列化性,则无法保证此类集合的可序列化性。 具体而言,许多视图集合不可序列化。
无法保证实现接口的 Serializable
集合实现可序列化。 原因是一般情况下,集合包含其他类型的元素,并且无法静态确定某些元素类型的实例是否实际可序列化。 例如,请考虑可序列化 Collection<E>
的,其中 E
不实现 Serializable
接口。 如果集合仅包含某些可序列化子类型的 E
元素,或者该集合为空,则集合可能可序列化。 因此,集合是 有条件的可序列化的, 因为整个集合的可序列化性取决于集合本身是否可序列化,以及所有包含的元素是否也是可序列化的。
另一种情况发生在实例 SortedSet
和 SortedMap
. 可以使用对集元素或映射键施加排序的集合 Comparator
来创建这些集合。 仅当提供的 Comparator
集合也是可序列化的时,此类集合才可序列化。
此接口是 Java 集合框架的成员。
已在 1.2 中添加。
适用于 . 的 java.util.Collection
Java 文档
本页的某些部分是根据 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) |
集合层次结构中的根接口。 |