Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

  • 2019 年 10 月 3 日
  • 筆記

????????Set????????HashSet?LinkedHashSet?TreeSet???????????????

???????????JDK???1.8.0_191

1. HashSet??

HashSet?Set?????????????????????HashSet??????????????????

private transient HashMap<E,Object> map;

HashSet???????????

public class HashSet<E>      extends AbstractSet<E>      implements Set<E>, Cloneable, java.io.Serializable  {      ......  }

1.1 ????

??HashSet??????????????

HashSet<String> platformSet = new HashSet<>();    // ????  System.out.println(platformSet.add("???"));  System.out.println(platformSet.add("??"));  System.out.println(platformSet.add("?????"));    // ??????,??????,??Set???????  // ????????,????false,?????  System.out.println(platformSet.add("???"));  System.out.println(platformSet.add("??"));

?????????????

true

true

true

false

false

????????platformSet??3????

???????platformSet.add(3, "????");??????????????Set????????1???????????????List???????2????

1.2 ????

?List????????Set??????????????

1.3 ????????

??HashSet??????????????

System.out.println("platformSet???????" + platformSet.size());

1.4 ????

?????????HashSet???????1?????????ArrayList?????2????

public boolean remove(Object o) {      return map.remove(o)==PRESENT;  }

?????????

// ????????"????",??false  System.out.println(platformSet.remove("????"));  // ??????? "?????",??true  System.out.println(platformSet.remove("?????"));

1.5 ????

?List????????Set??????????????

1.6 ????????

??HashSet??????????????

System.out.println("isEmpty:" + platformSet.isEmpty());

1.7 ????(????)

??HashSet????????2????

  1. ?????
  2. foreach??

?????????

System.out.println("??Iterator???");  Iterator<String> platformIterator = platformSet.iterator();  while (platformIterator.hasNext()) {      System.out.println(platformIterator.next());  }    System.out.println();  System.out.println("??foreach???");  for (String platform : platformSet) {      System.out.println(platform);  }

1.8 ????

??HashSet???????????????

platformSet.clear();

1.9 ??????

?????????????????

package collection;    import java.util.HashSet;  import java.util.Iterator;  import java.util.Set;    public class SetTest {      public static void main(String[] args) {          Set<String> platformSet = new HashSet<>();            // ????          System.out.println(platformSet.add("???"));          System.out.println(platformSet.add("??"));          System.out.println(platformSet.add("?????"));            // ??????,??????,??Set???????          // ????????,????false,?????          System.out.println(platformSet.add("???"));          System.out.println(platformSet.add("??"));              System.out.println("platformSet???????" + platformSet.size());            // ????????"????",??false          System.out.println(platformSet.remove("????"));          // ??????? "?????",??true          System.out.println(platformSet.remove("?????"));            System.out.println("platformSet???????" + platformSet.size());            System.out.println("isEmpty:" + platformSet.isEmpty());            System.out.println("??Iterator???");          Iterator<String> platformIterator = platformSet.iterator();          while (platformIterator.hasNext()) {              System.out.println(platformIterator.next());          }            System.out.println();          System.out.println("??foreach???");          for (String platform : platformSet) {              System.out.println(platform);          }            System.out.println();            platformSet.clear();          System.out.println("isEmpty:" + platformSet.isEmpty());      }  }

??????

true

true

true

false

false

platformSet???????3

false

true

platformSet???????2

isEmpty:false

??Iterator???

???

??

??foreach???

???

??

isEmpty:true

2. LinkedHashSet??

LinkedHashSet??Set????????????????????????????????????????????????FIFO(First Input First Output ????)?

LinkedHashSet???????????

public class LinkedHashSet<E>      extends HashSet<E>      implements Set<E>, Cloneable, java.io.Serializable {  {  }

??????????LinkedHashSet????HashSet??

LinkedHashSet???????HashSet???????????????????

Set<String> platformSet = new LinkedHashSet<>();

3. TreeSet??

TreeSet??Set??????????????????TreeSet????????????????????

TreeSet???????????

public class TreeSet<E> extends AbstractSet<E>      implements NavigableSet<E>, Cloneable, java.io.Serializable  {  }

TreeSet???????HashSet???????????????????

Set<String> platformSet = new TreeSet<>();

4. HashSet?LinkedHashSet?TreeSet???(????)

HashSet?LinkedHashSet?TreeSet???Set???3????????

HashSet?????????????

LinkedHashSet?????????FIFO(????)???????

TreeSet?????????(???????????)

4.1 ???

1)HashSet?LinkedHashSet?TreeSet????Set??

2)?????????????????????

3)??????????

????Collections.synchronizedSet()?????????

4.2 ???

4.2.1 ??

HashSet????????

LinkHashSet??FIFO????????

TreeSet?????????????????

????????????

HashSet<String> hashSet = new HashSet<>();  LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();  TreeSet<String> treeSet = new TreeSet<>();    String[] letterArray = new String[]{"B", "A", "D", "C", "E"};  for (String letter : letterArray) {      hashSet.add(letter);      linkedHashSet.add(letter);      treeSet.add(letter);  }    System.out.println("HashSet(??????):" + hashSet);  System.out.println("LinkedHashSet(???????????):" + linkedHashSet);  System.out.println("TreeSet(?????????????):" + treeSet);

???????????

HashSet(??????):[A, B, C, D, E]

LinkedHashSet(???????????):[B, A, D, C, E]

TreeSet(?????????????):[A, B, C, D, E]

4.2.2 null?

HashSet?LinkedHashSet????null??TreeSet?????null????null????java.lang.NullPointerException???

Set<String> platformSet = new TreeSet<>();  platformSet.add(null);

?????????????????

4.2.3 ??

???????????????? HashSet??????LinkedHashSet?TreeSet????????????

???????????????????Employee??????????

package collection;    public class Employee implements Comparable<Employee> {      private Integer employeeNo;        public Employee(Integer employeeNo) {          this.employeeNo = employeeNo;      }        public Integer getEmployeeNo() {          return employeeNo;      }        public void setEmployeeNo(Integer employeeNo) {          this.employeeNo = employeeNo;      }        @Override      public int compareTo(Employee o) {          return this.employeeNo - o.employeeNo;      }  }

??????????????HashSet?LinkedHashSet?TreeSet???10000????

Random random = new Random();  HashSet<Employee> hashSet = new HashSet<>();  LinkedHashSet<Employee> linkedHashSet = new LinkedHashSet<>();  TreeSet<Employee> treeSet = new TreeSet<>();    int maxNo = 10000;    long startTime = System.nanoTime();  for (int i = 0; i < maxNo; i++) {      int randomNo = random.nextInt(maxNo - 10) + 10;      hashSet.add(new Employee(randomNo));  }    long endTime = System.nanoTime();  long duration = endTime - startTime;  System.out.println("HashSet??: " + duration);    startTime = System.nanoTime();  for (int i = 0; i < maxNo; i++) {      int randomNo = random.nextInt(maxNo - 10) + 10;      linkedHashSet.add(new Employee(randomNo));  }    endTime = System.nanoTime();  duration = endTime - startTime;  System.out.println("LinkedHashSet:?? " + duration);    startTime = System.nanoTime();  for (int i = 0; i < maxNo; i++) {      int randomNo = random.nextInt(maxNo - 10) + 10;      treeSet.add(new Employee(randomNo));  }    endTime = System.nanoTime();  duration = endTime - startTime;  System.out.println("TreeSet??: " + duration);

?1?????????

HashSet??: 6203357

LinkedHashSet:?? 5246129

TreeSet??: 7813460

?2?????????

HashSet??: 9726115

LinkedHashSet:?? 5521640

TreeSet??: 6884474

?3?????????

HashSet??: 7263940

LinkedHashSet:?? 6156487

TreeSet??: 8554666

?4?????????

HashSet??: 6140263

LinkedHashSet:?? 4643429

TreeSet??: 7804146

?5?????????

HashSet??: 7913810

LinkedHashSet:?? 5847025

TreeSet??: 8511402

?5???????????TreeSet????????LinkedHashSet???????HashSet??

???????HashSet???????????????HashSet?LinkedHashSet?????

????????????????

5. TreeSet???????(????)

????????TreeSet??????

TreeSet<String> treeSet = new TreeSet<>();    String[] letterArray = new String[]{"B", "A", "D", "C", "E"};  for (String letter : letterArray) {      treeSet.add(letter);  }    System.out.println("TreeSet(?????????????):" + treeSet);

??????????"B", "A", "D", "C", "E"???????????"A", "B", "C", "D", "E"???TreeSet?????????????

???TreeSet?????????????????????????????????

????????????Student????

package collection;    public class Student {      private String name;      private int age;        public Student(String name, int age) {          this.name = name;          this.age = age;      }        public String getName() {          return name;      }        public void setName(String name) {          this.name = name;      }        public int getAge() {          return age;      }        public void setAge(int age) {          this.age = age;      }  }

???????????

TreeSet<Student> studentTreeSet = new TreeSet<>();    Student student1 = new Student("zhangsan", 20);  Student student2 = new Student("lisi", 22);  Student student3 = new Student("wangwu", 24);  Student student4 = new Student("zhaoliu", 26);    Student student5 = new Student("zhangsan", 22);    studentTreeSet.add(student1);  studentTreeSet.add(student2);  studentTreeSet.add(student3);  studentTreeSet.add(student4);  studentTreeSet.add(student5);    for (Student student : studentTreeSet) {      System.out.println("name:" + student.getName() + ",age:" + student.getAge());  }

??????????????????????????

????????

??????????Student??????????TreeSet???????????????????????

??????????????

  1. ????
  2. ?????

5.1 ????

???????????Student?????Comparable??????????compareTo????????????

??IDEA???????compareTo?????????

@Override  public int compareTo(Student o) {      return 0;  }

????????add()????????????????????

????0???????????????????

???????0?????????????????o???

???????0?????????????????o???

?????compareTo()?????????????????????????????1????

name:zhangsan,age:20

?????compareTo()???????

@Override  public int compareTo(Student o) {      // ????????      // ?????????,????????,????????      // ?????????????????String      // ????????,?????,????????,????????        int orderByNameLength = this.name.length() - o.name.length();      int orderByName = orderByNameLength == 0 ? this.name.compareTo(o.name) : orderByNameLength;      int orderByAge = orderByName == 0 ? this.age - o.age : orderByName;        return orderByAge;  }

?????????????????????

name:lisi,age:22

name:wangwu,age:24

name:zhaoliu,age:26

name:zhangsan,age:20

name:zhangsan,age:22

5.2 ?????

????????????????????????Comparator???????Compare()???

?????????Student????????Comparable?????????????compareTo?

package collection;    import java.util.Comparator;    public class StudentComparator implements Comparator<Student> {      @Override      public int compare(Student o1, Student o2) {          // ????????          // ?????????,????????,????????          // ?????????????????String          // ????????,?????,????????,????????            int orderByNameLength = o1.getName().length() - o2.getName().length();          int orderByName = orderByNameLength == 0 ? o1.getName().compareTo(o2.getName()) : orderByNameLength;          int orderByAge = orderByName == 0 ? o1.getAge() - o2.getAge() : orderByName;            return orderByAge;      }  }

????????????studentTreeSet??????

TreeSet<Student> studentTreeSet = new TreeSet<>(new StudentComparator());

?????????????????????

6. ?????

Java???List,Set??Map???????(????)

7. ??

??????????????????????????????Java?????????????