一. HashSet
1. HashSet 数据结构哈希表。HashSet 中的元素是不能重复的,需要覆盖 hashcode 和 equals 方法来保证元素不会重复。
Java Platform SE 7 https://docs.oracle.com/javase/7/docs/api/2. HashSet 使用示例
// (1) 定义 HashSet HashSet<String> hs = new HashSet<String>(); // (2) 添加元素 hs.add("three"); hs.add("one"); hs.add("two"); hs.add("one"); // (3) for 遍历 for(String e:hs){ System.out.println(e); } // (4) 迭代器编译 Iterator<String> it = hs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } // (5) 自定义的类需要重载实现 hashcode() 和 equals() 方法来保证 HashSet 中元素不重复 class Person implements Comparable<Person>{ // 重载 equals() 方法,定义判断两个Person对象相等的规则 @Override public boolean equals(Object obj) { Person p1 = (Person)obj; return p1.pid == this.pid; } // 重载 hashCode() 方法,定义实现 @Override public int hashCode() { return this.pid+this.name.hashCode(); } private int pid; private String name; public Person(int pid, String name) { super(); this.pid = pid; this.name = name; } } HashSet<Person> hs = new HashSet<Person>(); Person p1 = new Person(1,"tom"); Person p2 = new Person(2,"kite"); Person p3 = new Person(3,"rose"); Person p4 = new Person(1,"tom"); hs.add(p1); hs.add(p2); hs.add(p3); hs.add(p4); // 根据 equals() 方法,pid相同的元素相等,所以 HashSet 中 p4 会覆盖 p1 for(Person e:hs){ System.out.println(e); }
二. TreeSet
1. TreeSet 的数据结构是树。TreeSet 有自动排序的功能,自定义的对象除了需要重载 hashCode 和 equals 方法外,还需要重载 compareTo 方法自定义排序功能。
// 定义一个 TreeSet TreeSet<Person> ts = new TreeSet<Person>(); // 自定义的对象 Person p1 = new Person(1,"tom"); Person p2 = new Person(2,"kite"); Person p3 = new Person(3,"rose"); Person p4 = new Person(1,"tom"); // 添加元素 ts.add(p3); ts.add(p1); ts.add(p2); ts.add(p4); // 遍历 for(Person e:ts){ System.out.println(e); } class Person implements Comparable<Person>{ @Override public int hashCode() { return this.pid+this.name.hashCode(); } @Override public boolean equals(Object obj) { Person p1 = (Person)obj; return p1.pid == this.pid; } @Override public String toString() { return pid+":"+name; } private int pid; private String name; public Person(int pid, String name) { super(); this.pid = pid; this.name = name; } // 此 compareTo 实现 pid 降序排序 @Override public int compareTo(Person o) { if(this.pid>o.pid){ return -1; }else if(this.pid==o.pid){ return 0; }else{ return 1; } } }