还是一样,和C++ STL中的 set 类似。
如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。
Set:无顺序,不包含重复的元素
HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
操作
代码 | 作用 |
---|---|
add(E e) | 添加元素 |
addAll(Collection<? extends E> c) | 复制到此集合中 |
contains(Object o) | 如果包含指定的元素,则返回 true |
containsAll(Collection<?> c) | 如果包含指定 collection 的所有元素,则返回 true |
clear() | 清空所有元素 |
remove(Object o) | 如果存在指定的元素,则将其移除 |
removeAll(Collection<?> c) | 移除那些包含在指定 collection 中的元素 |
equals(Object o) | 比较指定对象与此 set 的相等性 |
isEmpty() | 如果不包含元素,则返回 true |
retainAll(Collection<?> c) | 仅保留那些包含在指定 collection 中的元素 |
size() | 返回元素个数 |
hashCode() | 返回 set 的哈希码值 |
toArray() | 返回一个包含 set 中所有元素的数组 |
创建
Set<String> set = new HashSet<>(); //无序
Set<String> set = new TreeSet<>(); //有序
遍历
// foreach
for (String string : set) {
System.out.println(string);
}
// iterator
Iterator<String> setIterator = set.iterator();
while (setIterator.hasNext()) {
String string = (String) setIterator.next();
System.out.println(string);
}
TreeSet的改写Comparable方法和TreeMap类似
class Person {
public String name;
public int score;
/...
}
Set<Person, Integer> map = new TreeSet<>(new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name);
}
});
Set<Student, Integer> map = new TreeSet<>(new Comparator<Person>() {
if (p1.score == p2.score) {
return 0;
}
return p1.score > p2.score ? -1 : 1;
});