Set、Collection、List、SortedSet、HashSet

来源:互联网 发布:软件开发生命周期模型 编辑:程序博客网 时间:2024/06/05 01:04
SET
不包含重复元素的集合。更正式地,集合不包含一对元素e1和e2,使得e1.equals(e2)和最多一个空元素。正如其名称所暗示的,这个接口模拟了数学集抽象。

Set接口除了从Collection接口继承之外,还添加了所有构造函数的合同以及add,equals和hashCode方法的合同。其他继承方法的声明也包括在这里,以方便。 (伴随这些声明的规范已经针对“Set”界面进行了定制,但不包含任何其他规定。)

构造函数的额外规定并不奇怪,所有构造函数都必须创建一个不包含重复元素的集合(如上所述)。

注意:如果可变对象用作Set元素,则必须非常小心。如果对象的值以影响等效比较的方式更改,而对象是集合中的元素,则不会指定集合的行为。这种禁止的一个特殊情况是,不允许一个集合包含自己作为一个元素。

一些集合实现对它们可能包含的元素有限制。例如,一些实现禁止空元素,一些实现方式对元素的类型有限制。尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException。尝试查询不合格元素的存在可能会引发异常,或者可能只是返回false;一些实现将展现出前者的行为,一些实现将展现出后者。更一般来说,尝试对不符合条件的元素进行操作时,其完成不会导致将不合格元素插入到集合中,这可能会导致异常,或者可能会成功执行该选项。此异常在此接口的规范中标记为“可选”。

此接口是Java Collections Framework的成员。
类型参数:<E>由此集合维护的元素的类型

COLLECTION
集合层次结构中的根界面。集合表示一组被称为其元素的对象。一些集合允许重复元素,而其他集合不。有些被命令,其他人无序。 JDK不提供这个接口的任何直接实现:它提供了更多特定子接口的实现,如Set和List。该界面通常用于传递集合,并在需要最大的一般性的情况下对其进行操作。
包或多重集(可能包含重复元素的无序集合)应直接实现此接口。
所有通用的Collection实现类(通常通过其子接口间接实现Collection)应该提供两个“标准”构造函数:一个void(无参数)构造函数,它创建一个空集合,以及一个具有单个参数类型的构造函数集合,它创建一个与其参数相同的元素的新集合。实际上,后一个构造函数允许用户复制任何集合,从而生成所需实现类型的等效集合。没有办法执行这个约定(因为接口不能包含构造函数),而是Java平台库中的所有通用的Collection实现都符合。指定此接口中包含的“破坏性”方法,即修改其操作的集合的方法,以引发UnsupportedOperationException,如果此集合不支持该操作。如果是这种情况,如果调用对集合没有影响,这些方法可能会抛出UnsupportedOperationException,但不是必需的。例如,如果要添加的集合为空,则可以在不可修改的集合上调用addAll(Collection)方法,但不是必须抛出异常。
某些集合实现对它们可能包含的元素有限制。例如,一些实现禁止空元素,一些实现方式对元素的类型有限制。尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException。尝试查询不合格元素的存在可能会引发异常,或者可能只是返回false;一些实现将展现出前者的行为,一些实现将展现出后者。更一般来说,尝试对不符合条件的元素的操作,其完成不会导致将不合格元素插入到集合中可能会导致异常,或者可能会成功执行该选项。此异常在此接口的规范中标记为“可选”。

每个集合决定自己的同步策略。在没有执行的更强保证的情况下,未定义的行为可能是由对另一个线程进行变异的集合上的任何方法的调用产生的;这包括直接调用,将集合传递给可能执行调用的方法,并使用现有的迭代器来检查集合。

Collections Framework接口中的许多方法都是用equals方法来定义的。例如,contains(Object o)方法的规范说:“当且仅当此集合至少包含一个元素e才能返回true,以便(o == null?e == null:o.equals(e)) “。该规范不应被解释为暗示使用非空参数调用Collection.contains o将导致为任何元素e调用o.equals(e)。实现可以自由地实现优化,从而避免等待调用,例如,首先比较两个元素的哈希码。 (Object.hashCode()规范保证具有不等的哈希码的两个对象不能相等。)更一般地,各种Collections Framework接口的实现可以随意利用底层Object方法的指定行为,无论执行者认为合适。

执行递归遍历集合的一些集合操作可能会失败,并且对于自引用实例的异常,其中集合直接或间接包含其自身。这包括clone(),equals(),hashCode()和toString()方法。实现可以可选地处理自引用场景,然而大多数当前实现不这样做。

此接口是Java Collections Framework的成员。
类型参数:<E>此集合中元素的类型


LIST
有序集合(也称为序列)。该界面的用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

与集合不同,列表通常允许重复的元素。更正式地,列表通常允许成对的元素e1和e2使得e1.equals(e2),并且它们通常允许多个空元素,如果它们允许空元素完全。有人可能希望实现一个禁止重复的列表,当用户尝试插入运行时异常时,我们希望这种使用是罕见的。

列表界面除了Collection界面中指定的附加规定之外,还添加了迭代器,add,remove,equals和hashCode方法的合同。其他继承方法的声明也包括在这里,以方便。
列表界面提供四种位置(索引)访问列表元素的方法。列表(如Java数组)基于零。请注意,这些操作可能与某些实现的索引值(例如LinkedList类)成正比执行。因此,如果调用者不知道该实现,则迭代列表中的元素通常优于通过它进行索引。

List接口提供了一个特殊的迭代器,称为ListIterator,允许元素插入和替换,以及Iterator接口提供的常规操作之外的双向访问。提供了一种方法来获得从列表中的指定位置开始的列表迭代器。

List接口提供两种方法来搜索指定的对象。从性能的角度来看,应谨慎使用这些方法。在许多实现中,它们将执行昂贵的线性搜索。

List接口提供了两种方法来有效地插入和删除列表中任意一点上的多个元素。

注意:虽然列表允许将其自身作为元素,但建议您非常小心:equals和hashCode方法在这样的列表中不再被很好地定义。

一些列表实现对它们可能包含的元素有限制。例如,一些实现禁止空元素,一些实现方式对元素的类型有限制。尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException。尝试查询不合格元素的存在可能会引发异常,或者可能只是返回false;一些实现将展现出前者的行为,一些实现将展现出后者。更一般来说,尝试对不符合条件的元素的操作,其完成不会导致将不合格元素插入到列表中可能会抛出异常,或者可能会成功执行该选项。此异常在此接口的规范中标记为“可选”。

此接口是Java Collections Framework的成员。
类型参数:<E>此列表中元素的类型

SortedSET
一个进一步提供其元素的总排序的集合。这些元素使用其自然排序或通过在排序集创建时提供的比较器进行排序。集合的迭代器将以递增的元素顺序遍历集合。提供了几个额外的操作来利用排序。 (此接口是SortedMap的设置模拟。) 插入到排序集中的所有元素必须实现Comparable接口(或被指定的比较器接受)。此外,所有这些元素必须相互可比较:e1.compareTo(e2)(或comparator.compare(e1,e2))不得为排序集中的任何元素e1和e2抛出ClassCastException。尝试违反此限制将导致违规方法或构造函数调用抛出ClassCastException。 请注意,排序集合(无论是否提供显式比较器)维护的排序必须与等于如果排序集合正确实现Set接口一致。 (见Comparable接口或Comparator接口,以获得与equals一致的精确定义)这是因为Set接口是根据equals操作定义的,但是一个排序集使用compareTo(或比较)方法执行所有元素比较因此,从排序集合的观点来看,通过该方法认为相等的两个元素是相等的。排序集合的行为是明确定义的,即使其排序与equals不一致;它只是不符合Set界面的总体合同。
所有通用排序集实现类应提供四个“标准”构造函数:1)一个void(无参数)构造函数,它创建一个根据其元素的自然排序排序的空排序集。 2)具有Comparator类型的单个参数的构造函数,其创建根据指定的比较器排序的空的排序集。 3)具有单一参数类型为Collection的构造函数,它创建一个与其参数相同的元素的新的排序集,根据元素的自然排序进行排序。 4)具有SortedSet类型的单个参数的构造函数,它创建一个具有相同元素的新排序集,并且与输入排序集相同。无法强制执行此建议,因为接口不能包含构造函数。

注意:几种方法返回限制范围的子集。这种范围是半开放的,也就是说,它们包括其低端点,但不包括其高端点(如适用)。如果您需要一个封闭的范围(包括两个端点),并且元素类型允许计算给定值的后继,只需将subrange从lowEndpoint请求到后台(highEndpoint)。例如,假设s是一组排序的字符串。以下成语获取包含s中从s到s的所有字符串的视图,包括:
SortedSet <String> sub = s.subSet(low,high +“\ 0”);
可以使用类似的技术来生成开放范围(其不包含端点)。以下成语获得包含s中所有字符串从低到高的视图,独占:SortedSet <String> sub = s.subSet(low +“\ 0”,high);

此接口是Java Collections Framework的成员。


HashSET
此类实现了Set接口,由哈希表(实际上是HashMap实例)支持。对集合的迭代次序不作任何保证;特别是不能保证订单在一段时间内保持不变。此类允许null元素。

假设散列函数正确地分散在这些存储区中,这个类提供了基本操作(add,remove,contains和size)的恒定时间性能。迭代该集合需要时间与HashSet实例的大小(元素数量)和后台HashMap实例的“容量”(桶数)的总和成比例。因此,如果迭代性能很重要,不要将初始容量设置得太高(或负载因子太低)是非常重要的。

请注意,此实现不同步。如果多个线程同时访问哈希集,并且至少有一个线程修改该集合,那么它必须在外部进行同步。这通常通过在自然地封装集合的一些对象上进行同步来实现。如果没有此类对象存在,则该集合应使用Collections.synchronizedSet方法“包装”。这最好在创建时完成,以防止意外的非同步访问集:
设置s = Collections.synchronizedSet(new HashSet(...));

这个类的迭代器方法返回的迭代器是故障快速的:如果在迭代器创建之后的任何时候修改集合,除了通过迭代器自己的remove方法之外,迭代器会抛出一个ConcurrentModificationException异常。因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。

请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。失败快速的迭代器尽力地抛出ConcurrentModificationException。因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。

这个类是Java Collections Framework的成员。
类型参数:<E>由此集合维护的元素的类型














































































阅读全文
0 0
原创粉丝点击