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????
- ?????
- 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???????????????????????
??????????????
- ????
- ?????
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?????????????