Java中的LinkedHashSet和TreeSet解读
更新时间:2023年09月05日 09:35:22 作者:jtjeeeee
这篇文章主要介绍了Java中的LinkedHashSet和TreeSet解读,哈希表和链表实现的set接口哈希表决定了它元素是唯一的,而链表则保证了他是有序的(存储和取出顺序一致),元素按照一定规则排序,不是按储存时间排的,需要的朋友可以参考下
一,LinkedHashSet
- 哈希表和链表实现的set接口
- 哈希表决定了它元素是唯一的,而链表则保证了他是有序的(存储和取出顺序一致)
二,TreeSet
- 元素按照一定规则排序,不是按储存时间排的
- 具体排序方法由构造方法决定
- 无参构造TreeSet()故居元素的自然排序进行排序
- 没有索引无法使用普通for循环进行遍历
- 也属于set集合,没有重复元素
三,排序
- 自然排序Comparable通过返回正负数和0判断,返回正数说明前一个比将要储存进来的大,即放到前面
- 返回的是负数说明前一个比将要储存进来的小,就会放在后面,这样就做到了从小到大排列
- 返回0他会以为元素一致而不存储
- 利用以上规则,当实现Comparable接口时,可以重写compareTo()方法,一我们想要的顺序输出
- 例如:按存储时间直接return 1(正数);,按时间的倒序return -1(负数);
Comparator比较器
- 当使用带参构造时,需要传Comparator接口(实际传得应该是他的实现类对象)
- 由于匿名内部类就相当于一个接口的实现类所以可以用匿名内部类代替,否则需要写一个接口实现类,然后创建它的对象传进去
- 最后用复杂一点的比较器练习一下
- Student类,当使用无参构造即自然排序时需要实现一下Comparable接口
public class Student { public String name; public int chinese; public int math; public Student(){} public Student(String name,int chinese,int math){ this.chinese=chinese; this.name=name; this.math=math; } @Override public String toString() { return "名字:"+name+" "+"语文:"+chinese+" "+"数学:"+math+"\t"; } }
测试类
import java.util.Comparator; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { // TreeSet的有参构造,可以写一个Comparabor的实现类然后创建对象传进来,也可以直接写一个匿名内部类,因为他本身相当于接口的一个实现对象 TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // 按照成绩总分从低到高排 int result=(o1.math+o1.chinese)-(o2.math+o2.chinese); // 如果总分不同返回i是两个学生对象总成绩的差值,如果总分相同则按姓名排序(compareTo一样的话说明姓名相同,说明两个元素重复,则不会添加进去) int i=result==0?o1.name.compareTo(o2.name):result; return i; } }); Student s1=new Student("小明",88,99); Student s2=new Student("小华",87,100); Student s3=new Student("小天",86,94); Student s4=new Student("小亮",83,89); ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); System.out.println(ts); } }
结果
到此这篇关于Java中的LinkedHashSet和TreeSet解读的文章就介绍到这了,更多相关LinkedHashSet和TreeSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
spring cloud 阿波罗 apollo 本地开发环境搭建过程
Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性2018-01-01Spring事件监听器之@EventListener原理分析
这篇文章主要介绍了Spring事件监听器之@EventListener原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12Maven一键部署Springboot到Docker仓库为自动化做准备(推荐)
这篇文章主要介绍了Maven一键部署Springboot到Docker仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-07-07
最新评论