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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现的具有GUI的校园导航系统的完整代码

    Java实现的具有GUI的校园导航系统的完整代码

    这篇文章主要介绍了Java实现的具有GUI的校园导航系统的完整代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • spring cloud 阿波罗 apollo 本地开发环境搭建过程

    spring cloud 阿波罗 apollo 本地开发环境搭建过程

    Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性
    2018-01-01
  • Java基于Swing实现的打猎射击游戏代码

    Java基于Swing实现的打猎射击游戏代码

    这篇文章主要介绍了Java基于Swing实现的打猎射击游戏代码,包含完整的游戏事件处理与逻辑流程控制,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • Springboot集成ClickHouse及应用场景分析

    Springboot集成ClickHouse及应用场景分析

    这篇文章主要介绍了Springboot集成ClickHouse的实例代码,本文通过应用场景实例代码介绍了整合springboot的详细过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • springboot查询全部部门流程分析

    springboot查询全部部门流程分析

    本文分析了在SpringBoot框架中前端如何请求DeptController的list()方法,并通过DeptService到DeptMapper接口查询数据库中的全部部门信息的流程,整个过程涉及前端到后端数据的获取和返回,是SpringBoot应用中常见的数据处理模式
    2024-10-10
  • springboot自动装配原理初识

    springboot自动装配原理初识

    这篇文章主要介绍了springboot自动装配原理的相关资料,帮助大家更好的理解和学习使用springboot,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot中的Thymeleaf用法

    SpringBoot中的Thymeleaf用法

    Thymeleaf是最近SpringBoot推荐支持的模板框架。本文重点给大家介绍SpringBoot中的Thymeleaf用法,需要的的朋友参考下吧
    2017-05-05
  • Spring事件监听器之@EventListener原理分析

    Spring事件监听器之@EventListener原理分析

    这篇文章主要介绍了Spring事件监听器之@EventListener原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java8中的HashMap原理详解

    java8中的HashMap原理详解

    这篇文章主要介绍了java8中的HashMap原理详解,HashMap是日常开发中非常常用的容器,HashMap实现了Map接口,底层的实现原理是哈希表,HashMap不是一个线程安全的容器,需要的朋友可以参考下
    2023-09-09
  • Maven一键部署Springboot到Docker仓库为自动化做准备(推荐)

    Maven一键部署Springboot到Docker仓库为自动化做准备(推荐)

    这篇文章主要介绍了Maven一键部署Springboot到Docker仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论