目录
1.Set的特点
-
java.util.Set 不包含重复元素的集合、不能保证存储的顺序、只允许有一个 null
public interface Set<E> extends Collection<E>
-
抽象方法,都是继承自 java.util.Collection 接口,在此不做重复描述。
-
Set 集合的实现类有很多,在此我们重点了解 HashSet 、 TreeSet 、 LinkedHashSet
2.TreeSet
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
-
TreeSet非线程安全
-
值必须可比较(元素实现 Comparable 接口、传递 比较器 Comparator 对象)
-
不能存 null
-
判断是否是重复元素,是按照自然比较/比较器进行比较
就是说a.compareTo(b) == 0,如果是 true ,那么 add(a) 之后的 add(b) 将会返回 false ,也就是添加失败
3.TreeSet常用的构造和方法
方法名 | 描述 |
---|---|
TreeSet() | 构造一个新的空TreeSet集合,根据其元素的自然顺序进行排序 |
TreeSet(Comparator<?super E> comparator) | 构造一个新的空TreeSet集合,根据指定的比较器进行 |
TreeSet(Collection<?extends E> c) | 构造一个新的TreeSet集合,,该TreeSet集合包含指定集合中的元素,并根据其元素的自然顺序进行排序 |
ceiling(E e) E | 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。 |
first() E | 返回当前在此集合中的第一个(最低的)元素。 |
floor(E e) E | 返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回null。 |
headSet(EtoElement) | 返回此集合中元素严格小于toElement的部分的视图 |
higher(e) | 返回此集合中严格大于给定元素的最小元素,如果 |
first() | 返回当前在此集合中的最后一个(最高的)元素。 |
lower(e) | 返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则返回null。 |
pollFirst() | 检索并删除第一个(最低的)元素,如果此集合为空,则返回null |
pollLast() | 检索并删除最后一个(最高)元素,如果此集合为空,则返回null |
tailSet(E fromElement) | 返回此集合中元素严格大于或等于fromElement的部分的视图 |
4.方法实现的DEMO:
TreeSet<String> set = new TreeSet(List.of("null", "a", "a", "b", "c", "e", "f", "g")); System.out.println(set); // [a, b, c, e, f, g, null] // 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回null。 String ceiling = set.ceiling("d"); System.out.println(ceiling);// e // 返回当前在此集合中的第一个(最低的)元素。 String first = set.first(); System.out.println(first); // a // 返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则返回null。 String floor = set.floor("d"); System.out.println(floor); // c // 返回此集合中元素严格小于toElement的部分的视图。 SortedSet<String> headSet = set.headSet("c"); System.out.println(headSet); // a, b // 返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则返回null。 String higher = set.higher("c"); System.out.println(higher); // e // 返回此集合中元素严格大于或等于fromElement的部分的视图。 SortedSet<String> tailSet = set.tailSet("c"); System.out.println(tailSet); // c, e, f, g, null // 迭代 for (Object obj : set){ System.out.println(obj); }
5.HashSet
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
-
实现了 Set 接口,底层实现是 HashMap 。不保证迭代顺序,允许 null 元素
-
非线程安全的
如果 add 的值已存在( equals 方法返回 true ,基本数据类型自动装箱)返回 false
如果 HashSet 中存的是对象,需要重写此对象类中的 equals 和 hashCode() 方法
6.LinkedHashSet
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable 12
-
哈希表和双向链表实现的 Set 接口
-
具有可预测的迭代次序(有序)
-
内部实现是 LinkedHashMap ,顺序是插入顺序