TreeSet,Comparable接口,Comparator的实现类对象

本文介绍了TreeSet集合的特性和使用,包括其底层的红黑树数据结构,保证元素排序的方式:自然排序(实现Comparable接口)和比较器排序(使用Comparator的实现类对象)。详细解释了add()方法的源码实现,并给出了一个练习,要求按学生总分从高到低输出信息。
摘要由CSDN通过智能技术生成

TreeSet,Comparable接口,Comparator的实现类对象

一、Collection集合总结

Collection

|–List 有序,可重复
|–ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高

|–Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低

|–LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高

|–Set 无序,唯一

|–HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
----依赖两个方法:hashCode()和equals()
----开发中自动生成这两个方法即可

|–LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一

|–TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
----自然排序
----比较器排序
如何保证元素唯一性的呢?
----根据比较的返回值

二、针对Collection集合我们到底使用谁呢?

自定义列表

Set
排序吗?
是:TreeSet
否:HashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet。
List
要安全吗?
是:Vector
否:ArrayList或者LinkedList
------查询多:ArrayList
------增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList。

三、TreeSet集合

A:底层数据结构是红黑树(是一个自平衡的二叉树)
B:保证元素的排序方式
a:自然排序(元素具备比较性)让元素所属的类实现Comparable接口
(1)简单的使用

package cn.itcast_05;
import java.util.TreeSet;
/*
 * TreeSet:能够对元素按照某种规则进行排序
 * 排序由两种方式
 * A:自然排序
 * B:Comparator<T>,比较器排序
 */
public class TreeSetDemo {
   
	public static void main(String[] args) {
   
	//创建集合对象
  	//自然顺序进行排序
  	TreeSet<Integer> ts = new TreeSet<Integer>();
	
	//创建元素并添加
  	//20,18,23,22,17,24,19,18,24
  	ts.add(20);
  	ts.add(18);
  	ts.add(23);
  	ts.add(22);
  	ts.add(17);
  	ts.add(24);
  	ts.add(19);
  	ts.add(18);
  	ts.add(24);
  	
  	//遍历
 	 for(Integer i:ts){
   
   		System.out.println(i);
  	}
  }
}

在这里插入图片描述
(2)自定义对象使用,继承Comparable接口

package cn.itcast_07;
/*
 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口
 */
 public class Student implements Comparable<Student> {
   
 	private String name;
 	private int age;
 	
 	public Student() {
   
  	super();
 	 // TODO Auto-generated constructor stub
	 }
	 
 	public Student(String name, int age) {
   
  	super();
  	this.name = name;
  	this.age = age;
 	}
 	
	public String getName() {
   
  	return name;
	}
	
	public void setName(String name) {
   
  	this.name = name;
 	}
	
	public int getAge() {
   
  	return age;
 	}
	
	public void setAge(int age) {
   
  	this.age = age;
 	}
 	
	@Override
 	public String toString() {
   
  	return "Student [name=" + name + ", age=" + age + "]";
 	}

	@Override
 	//此处说明,写方法是为了给源码中的put方法提供东西,自平衡二叉树
 	public int compareTo(Student o) {
   
  	int num = this.age - o.age;
  	if (this.age != o.age) {
   
   		return num;
  	} else {
   
   		num = this.name.compareTo(o.name);
   	return num;
  	}
	/*
	   * int num = this.age - o.age; int num2 = num ==0 ?
	   * this.name.compareTo(s.name) : num; return num2;
	   */
	}
}
package cn.itcast_07;
import java.util.TreeSet;
/*
 * TreeSet存储自定义对象并保证排序和唯一
 * 
 * A:你没有告诉我怎么排序
 * 自然排序,按照年龄从小到大排序
 * B:元素什么情况下算唯一你也没有告诉我
 * 
 */
 public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值