Java TreeSet使用和底层原理_Comparable接口 尚学堂160

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可以看他的实现类:

Java TreeSet使用和底层原理_Comparable接口 尚学堂160_第1张图片

可以发现,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]


 

你可能感兴趣的:(Java_尚学堂笔记)