元素不能重复

  • TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。
    但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
  • HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。
    并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
  • LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。

    实现类

    HashSet

    HashSet扩展AbstractSet并且实现Set接口。
    无序排列
    基于哈希表实现,支持快速查找,但不支持有序性操作。
    失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
    1. HashSet(); // 建立默认的散列集合
    2. HashSet(Collection c); // 用c中元素初始化散列集合
    3. HashSet(int capacity); // 建立指定初始化容量的散列集合
    4. HashSet(int capacity,float fillRatio); // 初始化容量和填充比(加载容量)的散列集合
    5. /**
    6. * 填充比必须介于0.0~1.0之间,它决定在散列集合向上调整大小之前,有多少能被充满。
    7. * 具体说,就是当元素个数大于容量*填充比时,散列集合扩大
    8. * 没有填充比的构造方法,默认0.75
    9. */

判断重复元素,需要靠hashCode和equals

  1. class Box {
  2. private String name;
  3. private Integer size;
  4. public Box(String name,Integer size){
  5. this.name=name;
  6. this.size=size;
  7. }
  8. @Override
  9. public boolean equals(Object o) {
  10. if (this == o) {
  11. return true;
  12. }
  13. if (o == null || getClass() != o.getClass()) {
  14. return false;
  15. }
  16. Box box = (Box) o;
  17. return Objects.equals(name, box.name) &&
  18. Objects.equals(size, box.size);
  19. }
  20. @Override
  21. public int hashCode() {
  22. return Objects.hash(name, size);
  23. }
  24. @Override
  25. public String toString(){
  26. return "name:"+this.name+"-size:"+this.size+"\n";
  27. }
  28. }
  29. public class Main {
  30. public static void main(String[] args) throws Exception{
  31. Set<Box> all = new HashSet<>();
  32. all.add(new Box("Java",3));
  33. all.add(new Box("Java",3));
  34. all.add(new Box("JSP",3));
  35. all.add(new Box("Android",5));
  36. System.out.println(all);
  37. }
  38. }

TreeSet

TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序自动存储。
在存储了大量的需要进行快速检索排序信息的情况下,TreeSet是一个很好的选择。
基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。 但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。

  1. TreeSet(); // 建立空的树集合,该树集合将根据其元素的自然顺序按升序排序。
  2. TreeSet(Collection c); // 构造了包含c的元素的树集合
  3. TreeSet(Comparator comp); // 构造了空的树集合,它按照由comp指定的比较方法进行排序
  4. TreeSet(SortedSet ss); // 构造包含ss的元素的树集合

TreeSet排序

  1. class Box implements Comparable<Box> {
  2. private String name;
  3. private Integer size;
  4. public Box(String name,Integer size){
  5. this.name=name;
  6. this.size=size;
  7. }
  8. @Override
  9. public String toString(){
  10. return "name:"+this.name+"-size:"+this.size;
  11. }
  12. @Override
  13. public int compareTo(Box o) {
  14. if (this.size > o.size){
  15. return 1;
  16. }else if(this.size < o.size){
  17. return -1;
  18. }else {
  19. return this.name.compareTo(o.name);
  20. // return 0;
  21. }
  22. }
  23. }
  24. public class Main {
  25. public static void main(String[] args) throws Exception{
  26. Set<Box> all = new TreeSet<>();
  27. all.add(new Box("A",3));
  28. all.add(new Box("B",2));
  29. all.add(new Box("C",1));
  30. System.out.println(all);
  31. }
  32. }

LinkedHashSet

具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。