关于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("输入的类型不匹配");
}
}
关于TreeSet集合的理解的更多相关文章
- TreeSet集合解析
TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简析 假如有这么一个集 ...
- TreeSet集合的自然排序与比较器排序、Comparable接口的compareTo()方法
[自然排序] package com.hxl; public class Student implements Comparable<Student> { private String n ...
- 详解java中的TreeSet集合
TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简述 假如有这么一个集 ...
- 对JAVA的集合的理解
对JAVA的集合的理解是相对于数组 1.数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) 2.JAVA集合可以存储和操作数目不固定的一组数据. 3.所有的JAVA集合都位 ...
- TreeSet集合深入了解--------攻击原理
Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.(无序,不可重复 )Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说 ...
- Java 集合深入理解(8):AbstractSequentialList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...
- Java 集合深入理解(7):ArrayList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...
- Java 集合深入理解(4):List<E> 接口
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...
- TreeSet集合
TreeSet集合 TreeSet集合是一个依靠TreeMap实现的有序集合,内部存储元素是自动按照自然排序进行排列,所以如果想要保留存储时的顺序,那么就不建议使用TreeSet. TreeSet继承 ...
随机推荐
- 10 一键部署LNMP网站平台
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin NGINX_V=1.19.1 P ...
- 2、linux防火墙的使用(firewalld)
2.1.说明: 1.在 RHEL7 里有几种防火墙共存,firewalld.iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptabl ...
- JS replace 替换全部数据
(1)使用具有全局标志g的正则表达式 var str = "dogdogdog"; var str2 = str.replace(/dog/g,"cat");/ ...
- Redis 底层数据结构之跳跃表
文章参考 <Redis 设计与实现>黄建宏 Redis(2) 跳跃表 跳跃表 跳跃表 skiplist 是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节 ...
- LAMP——搭建基于Apache、wordpress、nfs、mysql、DNS的系统
一.部署架构 二.部署过程 1.在10.0.0.8和10.0.0.18服务器上安装apache服务 [17:10:06 root@centos8 ~]#yum -y install httpd 安装p ...
- leetcode 字符串转换整数 (模拟)
思路分析 1.跟着题意模拟,分成几种情况来看待 2.一种全是空格 3.有可能有空格,然后有符号的 4.有可能有空格,无符号数字 5.有可能有空格,非数字开头 6.最后还需要考虑一个越界的问题,所以要除 ...
- Hive源码上手及问题解决
一.编译准备 1.下载源码包 https://github.com/apache/hive/archive/refs/tags/rel/release-2.3.7.zip 或使用git直接拉取 无法解 ...
- 「CF505E」 Mr. Kitayuta vs. Bamboos
「CF505E」 Mr. Kitayuta vs. Bamboos 传送门 如果没有每轮只能进行 \(k\) 次修改的限制或者没有竹子长度必须大于 \(0\) 的限制那么直接贪心就完事了. 但是很遗憾 ...
- HDFS学习总结之架构
一.hdfs介绍 官网说明 Hadoop Distributed File System (HDFS): A distributed file system that provides high-th ...
- git的一些常用基础命令
一些常用的git命令操作简单总结 记录常用的git命令,附带命令的简单使用说明 git区域分布 remote远程仓库 repository本地仓库 index暂存区 workspace工作区 stas ...