https://www.sxt.cn/Java_jQuery_in_action/nine-treeset-underlyingimplementation.html
https://www.bilibili.com/video/BV1ct411n7oG?p=161
TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素。
TreeSet类源码:
public class TreeSet extends AbstractSet
implements NavigableSet, Cloneable, java.io.Serializable
{......}
他继承了AbstractSet抽象类,而AbstractSet抽象类又实现了Set接口:
public abstract class AbstractSet extends AbstractCollection implements Set
{......}
TreeSet的无参构造器,new了一个TreeMap对象:
public TreeSet() {
this(new TreeMap());
}
上面的this(new TreeMap
TreeSet(NavigableMap m) {
this.m = m;
}
其中,this.m在TreeSet类是这么定义的:
private transient NavigableMap m;
NavigableMap是一个接口,eclipse选中他后按Ctrl+t可以看他的实现类:
可以发现,TreeMap是NavigableMap接口的一个实现类。
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set set = new TreeSet<>();
set.add(300);
set.add(200);
set.add(600);
//按照元素递增的方式排好序
for (Integer m : set) {
System.out.println(m);
}
}
}
输出结果:
200
300
600
如果TreeSet放的元素类型是自己写的类,这个类必须实现Comparable接口:
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set set = new TreeSet<>();
set.add(new Emp(100, "张三", 50000));
set.add(new Emp(200, "李四", 5000));
set.add(new Emp(150, "王五", 6000));
set.add(new Emp(50, "赵六", 6000));
for (Emp emp : set) {
System.out.println(emp);
}
}
}
class Emp implements Comparable{//泛型里面是Emp,因为是Emp对象和Emp对象比较
int id;
String name;
double salary;
public Emp(int id, String name, double salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", salary=" + salary + "]";
}
@Override
public int compareTo(Emp o) {
/**
* 返回:
* 负数-小于
* 零-等于
* 正数-大于
* 一般用1、-1、0
*/
if(this.salary > o.salary) {
return 1;
}
else if (this.salary < o.salary) {
return -1;
}else {//如果2个人工资一样,用id来排序
if (this.id > o.id) {
return 1;
}
else if (this.id < o.id) {
return -1;
}
else {
return 0;
}
}
}
}
输出结果:
Emp [id=200, name=李四, salary=5000.0]
Emp [id=50, name=赵六, salary=6000.0]
Emp [id=150, name=王五, salary=6000.0]
Emp [id=100, name=张三, salary=50000.0]