Set
HashSet
存储结构:HashMap(数组+链表+红黑树)
存储过程:
- 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步
- 再执行equals,如果equals方法为true,则认为是重复元素,否则形成链表
重写hashcode和equals!
TreeSet
存储结构:红黑树(一种自平衡二叉查找树,左右平衡)
特点:
-
基于排列顺序实现元素不重复
-
实现了SortedSet接口,对集合元素自动排序
-
元素对象的类型必须实现Comparable接口,指定排序规则
-
通过CompareTo方法确定是否为重复元素
import java.util.TreeSet;
/**
* 使用TreeSet保存数据
* 要求:元素对象的类型必须实现Comparable接口,指定排序规则
* 若compareTo 方法返回值为0,则认为是重复元素
*/
public class Demo01 {
public static void main(String[] args) {
TreeSet<Person> persons = new TreeSet<>();
Person p1 = new Person("Leo", 20);
Person p2 = new Person("Ricky", 30);
Person p3 = new Person("Rack", 20);
Person p4 = new Person("Ricky", 40);
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
System.out.println(persons.toString());
// 删除
persons.remove(new Person("Leo", 20)); // 能够删除
persons.remove(p1);
System.out.println(persons.toString());
}
}
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 先按姓名比,再按年龄比
@Override
public int compareTo(Person o) {
int n1 = this.getName().compareTo(o.getName());
int n2 = this.getAge() - o.getAge();
return n1 == 0 ? n2 : n1;
}
}
Comparator接口
实现定制比较(比较器)
import java.util.Comparator;
import java.util.TreeSet;
/**
* TreeSet集合的使用
* Comparator: 实现定制比较(比较器)
*/
public class Demo02 {
public static void main(String[] args) {
TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
// 创建集合,并定比较规则
@Override
public int compare(Person o1, Person o2) {
int n1 = o1.getAge() - o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1 == 0 ? n2 : n1;
}
});
Person p1 = new Person("Leo", 20);
Person p2 = new Person("Ricky", 30);
Person p3 = new Person("Amy", 20);
Person p4 = new Person("Ricky", 40);
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
System.out.println(persons.toString());
}
}
import java.util.Comparator;
import java.util.TreeSet;
/**
* 要求:使用TreeSet集合实现字符串按照长度进行排序
*/
public class Demo03 {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length() - o2.length();
return n1 == 0 ? o1.compareTo(o2) : n1;
}
});
treeSet.add("hello");
treeSet.add("apple");
treeSet.add("nihaoya");
System.out.println(treeSet.toString());
}
}