序言:
基本类型在集合中可以直接使用,当我使用自己定以的类型时,在set中需要一种方式来维护存储顺序,而set不同的 实现直接方式也是不同的。

一、set集合

  1. set中的元素是不能重复的,因此加入set的元素必须定以equals方法(引用类型必须重写equalshashcode),同时set中的不保证维护元素的次序。

1.HashSet:

  1. ** 特点:**<br /> ①:查找元素快,存入其中的元素必须定以HashCode方法;

2.TreeSet:

  1. ** 特点:**<br /> ①:能够保存元素的次序,底层为树结构(红黑树)。<br /> <br /> ②:可以从set中提取有序的元素,所以元素必须要实现comparable接口。
  2. ③:不需要重写hashCode()和equals()方法,去重是依靠比较器来去重

因为结构是红黑树,所以每次插入都会遍历比较来寻找节点插入位置,如果发现某个节点的值是 一样的那就会直接覆盖。

  1. ** 示例:**
  1. public class Persons implements Comparable<Persons>{
  2. private String name;
  3. private Integer age;
  4. Persons(){
  5. }
  6. Persons(String name,Integer age){
  7. this.name=name;
  8. this.age=age;
  9. }
  10. @Override
  11. public String toString() {
  12. return "Persons{" +
  13. "name='" + name + '\'' +
  14. ", age=" + age +
  15. '}';
  16. }
  17. @Override
  18. public int compareTo(Persons o) {
  19. return age<o.age?1:(age>o.age?-1:0);
  20. }
  21. }
  22. class PresonsTest{
  23. public static void main(String[] args) {
  24. Set<Persons> set = new TreeSet<>();
  25. Persons persons = new Persons("aaa",12);
  26. Persons persons2 = new Persons("ccc",15);
  27. Persons persons3 = new Persons("aaa",12);
  28. Persons persons4= new Persons("ddd",10);
  29. Persons persons5= new Persons("ddd",16);
  30. Persons persons6= new Persons("ddd",18);
  31. set.addAll(Arrays.asList(persons,persons2,persons4,persons3,persons6,persons5));
  32. System.out.println(set);
  33. System.out.println(set.contains(persons3));//contains(persons3)也依靠比较器
  34. }
  35. }

3. LInkedHashSet:

  1. **特点:**<br /> ①:既有HashSet的查询速度,同时因为内部是链表存储机构,所以以插入的顺序维护元素,<br /> ②:使用迭代器遍历的时候会安装元素的插入顺序显示。<br /> ③:存入其中的元素也必须要定义hashCode()方法。

二、SortedSet:

  1. SortedSet中的元素可以保证处于排序状态提供的功能有:<br /> ①:**Comparator comparator** 方法,返回set集合使用的comparator,如果返回null,则表示自然排序<br /> ②: <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12862216/1619007431791-f6e4ac22-ec2d-4a53-8db6-a6c012e4eb61.png#clientId=u1a1d371b-2244-4&from=paste&height=144&id=u60ef654e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=203&originWidth=935&originalType=binary&size=86512&status=done&style=none&taskId=u96285ff5-42e9-4a21-94f0-6d547bc835f&width=661)<br /> 示例
  1. public class SortedSetDemo {
  2. public static void main(String[] args) {
  3. final SortedSet<String> sortedSet = new TreeSet<>();
  4. Collections.addAll(sortedSet, "one two three four five six seven eight".split(" "));
  5. System.out.println(sortedSet);
  6. String first = sortedSet.first();
  7. System.out.println(first);
  8. String last = sortedSet.last();
  9. System.out.println(last);
  10. final Iterator<String> iterator = sortedSet.iterator();
  11. for (int i = 0; i <=6 ; i++) {
  12. if (i==3) {
  13. first= iterator.next();
  14. System.out.println("i==3"+first);}
  15. else if (i==6) {
  16. System.out.println("i==6"+iterator.next());
  17. }else {
  18. System.out.println("其他时候" + iterator.next());
  19. }
  20. }
  21. System.out.println(sortedSet.subSet(first, last));
  22. System.out.println(sortedSet.headSet(last));
  23. System.out.println(sortedSet.tailSet(last));
  24. }
  25. }

注意:SortedSet的意思是按对象的比较函数进行元素排序。