java:集合框架(TreeSet保证元素唯一和自然排序的原理和图解)

TreeSet底层是二叉树,小的存储在左边(小的是指负数),大的存储在右边(大的是指正数),相等就不存(不存指的是0),说的是compareTo方法,在TreeSet集合如何存储元素取决于compareTo方法的返回值
当person类没有实现Comparable接口中compareTo方法时,会报java.lang.ClassCastException异常错误
当compareTo方法返回0的时候集合中只有一个元素(先储存的元素相当于树根,不走compareTo方法)

person类实现的compareTo方法

测试代码:

public class Demo2_TreeSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<person> ts=new TreeSet<>();
		ts.add(new person("张三", 23));
		ts.add(new person("李四", 13));
		ts.add(new person("王五", 43));
		ts.add(new person("小五", 43));
		ts.add(new person("赵六", 33));	
		System.out.println(ts);
	}
}

 返回结果:

[person [name=张三, age=23]]


当compareTo方法返回正数的时候,集合会怎么存就怎么取元素    

person类实现的compareTo方法

测试代码:

public class Demo2_TreeSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<person> ts=new TreeSet<>();
		ts.add(new person("张三", 23));
		ts.add(new person("李四", 13));
		ts.add(new person("王五", 43));
		ts.add(new person("小五", 43));
		ts.add(new person("赵六", 33));	
		System.out.println(ts);
	}
}

 返回结果: 

[person [name=张三, age=23], person [name=李四, age=13], person [name=王五, age=43], person [name=小五, age=43], person [name=赵六, age=33]]

 


当compareTo方法返回负数的时候,集合会倒序存储

person类实现的compareTo方法

测试代码:

public class Demo2_TreeSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<person> ts=new TreeSet<>();
		ts.add(new person("张三", 23));
		ts.add(new person("李四", 13));
		ts.add(new person("王五", 43));
		ts.add(new person("小五", 43));
		ts.add(new person("赵六", 33));	
		System.out.println(ts);
	}
}

运行结果: 

[person [name=赵六, age=33], person [name=小五, age=43], person [name=王五, age=43], person [name=李四, age=13], person [name=张三, age=23]]

按照元素里的字段进行比较排序 

person类实现的compareTo方法

 

测试代码:

public class Demo2_TreeSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<person> ts=new TreeSet<>();
		ts.add(new person("张三", 23));
		ts.add(new person("李四", 13));
		ts.add(new person("王五", 43));
		ts.add(new person("小五", 43));
		ts.add(new person("赵六", 33));	
		System.out.println(ts);
	}
}

 返回结果:

[person [name=李四, age=13], person [name=张三, age=23], person [name=赵六, age=33], person [name=小五, age=43], person [name=王五, age=43]]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值