您可以使用Set实现:
来自JAVADoc的一些信息:
一个不包含 重复元素的集合
。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个空元素。顾名思义,此接口对数学集合抽象进行建模。注意:
如果将可变对象用作集合元素,则必须格外小心。如果对象的值以影响相等比较的方式更改,而对象是集合中的元素,则不指定集合的行为。此禁止的一种特殊情况是,不允许集合将自身包含为元素。
这些是实现:
- 哈希集
该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在存储桶中。遍历此集合需要的时间与HashSet实例的大小(元素的数量)加上后备HashMap实例的“容量”(存储桶的数量)之和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得过高(或负载因子过低),这一点非常重要。
迭代
HashSet时,产生的元素的顺序是不确定的。
- 链接哈希集
Set接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双向链接列表。此链表定义了迭代顺序,即将元素插入到集合中的顺序(插入顺序)。请注意,如果将元素重新插入到集合中,则插入顺序不会受到影响。(如果在调用之前s.contains(e)将返回true的情况下调用s.add(e),则将元素e重新插入到set
s中。)
因此,上面代码的输出…
Set<Integer> linkedHashSet = new linkedHashSet<>(); linkedHashSet.add(3); linkedHashSet.add(1); linkedHashSet.add(2); for (int i : linkedHashSet) { System.out.println(i); }…一定是
312
- 树集
此实现为基本操作(添加,删除和包含)提供了保证的log(n)时间成本。默认情况下,他在迭代中返回的元素按其“
自然顺序 ”
排序,因此上面的代码…
Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(1); treeSet.add(2); for (int i : treeSet) { System.out.println(i); }…将输出以下内容:
123
(您还可以将
Comparator实例传递给
TreeSet构造函数,使其以不同的顺序对元素进行排序。)
请注意,如果要正确实现Set接口,则由集合(无论是否提供显式比较器)维护的顺序必须等于equals。(有关与equals一致的精确定义,请参见Comparable或Comparator。)之所以如此,是因为Set接口是根据equals操作定义的,但是TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此两个从集合的角度来看,此方法认为相等的元素是相等的。即使集合的顺序与equals不一致,它的行为也是明确定义的;它只是不遵守Set接口的一般约定。



