A Set
是 Collection
不能包含重复元素的。它模拟了数学集抽象。该Set
接口仅包含从中继承的方法,Collection
并添加禁止重复元素的限制。Set
还增加了关于equals
和hashCode
操作行为的更强的契约,允许Set
实例进行有意义的比较,即使它们的实现类型不同。Set
如果它们包含相同的元素,则两个实例相等。
Java平台包含三个通用Set
实现:HashSet
,TreeSet
,和LinkedHashSet
。 HashSet
,将其元素存储在哈希表中,是性能最佳的实现; 但是它不能保证迭代的顺序。 TreeSet
,将其元素存储在红黑树中,根据其值对其元素进行排序; 它比...慢得多HashSet
。 LinkedHashSet
实现为具有贯穿其的链表的哈希表,根据它们插入集合(插入顺序)的顺序对其元素进行排序。LinkedHashSet
使客户免受未指明的,通常混乱的订单的影响HashSet
,其成本仅略高一些.
该size
操作返回Set
(基数)中的元素数。该isEmpty
方法完全符合您的想法。该add
方法将指定的元素添加到Set
if尚未存在的元素中,并返回一个布尔值,指示是否添加了元素。类似地,该remove
方法从Set
if存在时删除指定的元素,并返回一个布尔值,指示元素是否存在。该iterator
方法返回一个Iterator
通过Set
。
请注意,代码始终引用Collection
其接口类型(Set
)而不是其实现类型。这是一个强烈推荐的编程实践,因为它使您可以灵活地仅通过更改构造函数来更改实现。如果用于存储集合的变量或用于传递它的参数被声明为Collection
实现类型而不是其接口类型,则必须更改所有此类变量和参数以更改其实现类型。
此外,无法保证生成的程序能够正常运行。如果程序使用原始实现类型中存在但未在新实现类型中存在的任何非标准操作,则程序将失败。仅通过其界面引用集合可防止您使用任何非标准操作。
Set
前面例子中的实现类型是HashSet
,它不保证元素的顺序Set
。如果您希望程序按字母顺序打印单词列表,只需将Set
实现类型更改HashSet
为TreeSet
。进行这种简单的单行更改会导致前一个示例中的命令行生成以下输出。
A List
是有序的 Collection
(有时称为序列)。列表可能包含重复元素。除了继承的操作外Collection
,该List
接口还包括以下操作:
Positional access
- 根据列表中的数字位置操纵元素。这包括方法,例如get
,set
,add
,addAll
,和remove
。Search
- 搜索列表中的指定对象并返回其数字位置。搜索方法包括indexOf
和lastIndexOf
。Iteration
- 扩展Iterator
语义以利用列表的顺序性。这些listIterator
方法提供了这种行为。Range-view
- 该sublist
方法对列表执行任意范围操作。
Java平台包含两个通用List
实现。 ArrayList
,这通常是性能更好的实现,并且 LinkedList
在某些情况下可以提供更好的性能。