Set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) = true 的元素对 e1 和 e2;也不包含满足 e1.compareTo(e2)=0 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
Set接口有三个实现。
1.HashSet
快速查找。必须同时重写 hashCode() 与
equals()。
2.LinkedHashSet
按插入的次序保存。
3.TreeSet
类的定义 :public class TreeSet<E> extends AbstractSet<E> implements
NavigableSet<E>, Cloneable, java.io.Serializable{}
3.1 NavigableSet接口
这是一个接口,它的定义是 public interface NavigableSet<E> extends
SortedSet<E>。
它表明这是一个有序的set,有以下常用方法:
E java.util.NavigableSet.floor(E e)
返回不大于e的最大的元素,若没有返回null。
E java.util.NavigableSet.ceiling(E e)
返回不小于e的最小的元素,若没有返回null。
SortedSet<E> java.util.NavigableSet.subSet(E fromElement, E toElement)
返回值在[fromElement,toElement)范围内的子集。
3.2 内部实现
红黑树实现。红黑树是一棵有序树,所以遍历TreeSet时元素是按照升序排列的。因此,放入其中的元素必须实现Comparable<E>接口。
注意:treeSet中已经有了e1,再调用treeSet.add(e2)试图放入e2,e2与e1的关系满足e1.compareTo(e2)==0,那么e2是不会被放进去的。
若放入的元素没有实现Comparable接口,会报错:java.lang.ClassCastException::yourPojo cannot be cast to java.lang.Comparable。
4.例子
三种set:
有关null: