元素不能重复
- TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。
但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 - HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。
并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 - LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
实现类
HashSet
HashSet扩展AbstractSet并且实现Set接口。
无序排列
基于哈希表实现,支持快速查找,但不支持有序性操作。
失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。HashSet(); // 建立默认的散列集合HashSet(Collection c); // 用c中元素初始化散列集合HashSet(int capacity); // 建立指定初始化容量的散列集合HashSet(int capacity,float fillRatio); // 初始化容量和填充比(加载容量)的散列集合/*** 填充比必须介于0.0~1.0之间,它决定在散列集合向上调整大小之前,有多少能被充满。* 具体说,就是当元素个数大于容量*填充比时,散列集合扩大* 没有填充比的构造方法,默认0.75*/
判断重复元素,需要靠hashCode和equals
class Box {private String name;private Integer size;public Box(String name,Integer size){this.name=name;this.size=size;}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Box box = (Box) o;return Objects.equals(name, box.name) &&Objects.equals(size, box.size);}@Overridepublic int hashCode() {return Objects.hash(name, size);}@Overridepublic String toString(){return "name:"+this.name+"-size:"+this.size+"\n";}}public class Main {public static void main(String[] args) throws Exception{Set<Box> all = new HashSet<>();all.add(new Box("Java",3));all.add(new Box("Java",3));all.add(new Box("JSP",3));all.add(new Box("Android",5));System.out.println(all);}}
TreeSet
TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序自动存储。
在存储了大量的需要进行快速检索排序信息的情况下,TreeSet是一个很好的选择。
基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。 但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
TreeSet(); // 建立空的树集合,该树集合将根据其元素的自然顺序按升序排序。TreeSet(Collection c); // 构造了包含c的元素的树集合TreeSet(Comparator comp); // 构造了空的树集合,它按照由comp指定的比较方法进行排序TreeSet(SortedSet ss); // 构造包含ss的元素的树集合
TreeSet排序
class Box implements Comparable<Box> {private String name;private Integer size;public Box(String name,Integer size){this.name=name;this.size=size;}@Overridepublic String toString(){return "name:"+this.name+"-size:"+this.size;}@Overridepublic int compareTo(Box o) {if (this.size > o.size){return 1;}else if(this.size < o.size){return -1;}else {return this.name.compareTo(o.name);// return 0;}}}public class Main {public static void main(String[] args) throws Exception{Set<Box> all = new TreeSet<>();all.add(new Box("A",3));all.add(new Box("B",2));all.add(new Box("C",1));System.out.println(all);}}
LinkedHashSet
具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
