一. 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;
}
}
}