关于TreeSet集合的理解
TreeSet 集合主要是实现了Collection集合的实现类,主要框架为:
1. Set接口的框架:
|----Collection接口:单例集合,用来存储一个一个的对象
|----Set接口: 存储无序的,不可重复的数据 ---->“”
|--->HashSet 、: 作为Set接口的主要实现类;线程不安全的,可以存储null值
|--->LinkedHashSet、:作为HasSet的子类,遍历其内部数据时,可以按照添加的顺序去遍历,
对于频繁的遍历操作,LinkedHashSet 效率高与HashSet。
|--->TreeSet:可以按照添加的对象指定属性进行排序。
TreeSet主要用途是:实现自定义类,或者其他类型的比较排序,分为 自然排序和 定制排序。
向 TreeSet 集合中添加数据,要求是相同类型的对象。
同时我们添加自定义类的过程中,需要实现Comparable接口,并实现compareTo方法。
关于Set接口的特性如下:
Set:存储无序的,不可重复的数据
以HasSet为例说明:
1.无序性: 不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
2.不可重复性:保证添加的元素按照equals() 判断时,不能返回true。即;相同的元素只能添加一个
值得注意的是:TreeSet 与HashSet 、LinkedHashSet不同:后者都是通过重写hashCode()、及equals()方法去判断内容是否相同,
而TreeSet是通过比较器去判断内容是否相同。
自然排序中,比较两个对象是否相同的标准为:compareTo()返回0,不再是equals()。
定制排序中,比较两个对象是否相同的标准为:compare()返回0,不再是equals()。
如:我们在TreeSet中添加不同的数据类型会异常。
TreeSet set = new TreeSet();
// 失败: 不能添加不同类的对象
// set.add(123);
// set.add(456);
// set.add("TOM");
所以在用TreeSet中,我们需要添加的是相同的数据类型:
set.add(new Person("tom",22));
set.add(new Person("jak",21));
set.add(new Person("dd",44));
关于Comparator接口的用法,我们可以在创建Comparator接口的时候,重写compare方法,实现制定排序的逻辑,同时将Comparator对象传入
TreeSet构造器中。如下:
public void test2(){
Comparator com = new Comparator() {
// 按照年龄从小到大排列。
@Override
public int compare(Object o, Object t1) {
if (o instanceof Person && t1 instanceof Person){
Person p1 =(Person)o;
Person p2 =(Person)t1;
return Integer.compare(p1.getAge(),p2.getAge());
}else {
throw new RuntimeException("输入的数据类型不匹配");
}
}
};
TreeSet set = new TreeSet(com);
关于Comparable接口的实现,在自定义类中,重写compareTo方法。具体如下:
// 按照姓名从小到大排列,起床年龄 从小到大排列
@Override
public int compareTo(Object o) {
if (o instanceof Person){
Person p = (Person)o;
// return this.name.compareTo(((Person) o).name);
// 在 TreeSet当中,他是根据compareTo的方式去比较的,如果返回的是0 则表示是相同数据,所以这边需要二重判断,先
//判断名字是否一样,如果是 返回0 在判断 年龄是否一样,这样就可以添加数据了
int conpare = this.name.compareTo((p.name));
if (conpare!=0){
return conpare;
}else {
return Integer.compare(this.age, p.age);
}
}else {
throw new RuntimeException("输入的类型不匹配");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)