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

相关文章

  • SpringBoot整合MyBatisPlus详解

    SpringBoot整合MyBatisPlus详解

    这篇文章详细介绍了SpringBoot整合mybatisplus的全过程,文中有详细的代码示例,具有一定的参考价值,需要的朋友可以参考一下
    2023-04-04
  • 详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    本篇介绍了Spring Boot 使用Java代码创建Bean并注册到Spring中,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java设计模式之观察者模式

    Java设计模式之观察者模式

    这篇文章主要为大家介绍了Java观察者模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • JDBC查询Map转对象实现过程详解

    JDBC查询Map转对象实现过程详解

    这篇文章主要介绍了JDBC查询Map转对象实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • try-with-resource优雅关闭io流的方法

    try-with-resource优雅关闭io流的方法

    这篇文章主要给大家介绍了关于try-with-resource优雅关闭io流的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • java 实现黄金分割数的示例详解

    java 实现黄金分割数的示例详解

    这篇文章主要介绍了java 实现黄金分割数的示例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springboot2.6.3读取不到nacos上的配置文件问题

    springboot2.6.3读取不到nacos上的配置文件问题

    这篇文章主要介绍了springboot2.6.3读取不到nacos上的配置文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring MVC中使用Google kaptcha验证码的方法详解

    Spring MVC中使用Google kaptcha验证码的方法详解

    kaptcha 是一个非常实用的验证码生成工具。有了它,你可以生成各种样式的验证码,因为它是可配置的,下面这篇文章主要给大家介绍了关于Spring MVC中使用Google kaptcha验证码的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Maven添加Tomcat插件实现热部署代码实例

    Maven添加Tomcat插件实现热部署代码实例

    这篇文章主要介绍了Maven添加Tomcat插件实现热部署代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java中实现将jar包内文件资源释放出来

    Java中实现将jar包内文件资源释放出来

    这篇文章主要介绍了Java中实现将jar包内文件资源释放出来的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论