• Java容器之set


    目录

    1.set

     2.hashset​编辑

    3.HashSet底层源码

    4.TreeSet

    5.TreeSet底层源码


    1.set

     2.hashset

     

    PS:记住这是无序的

     

     其他一些通用性质的方法和list很像,看API文档

    重写hashcode方法,返回一个int值

    判断是否相同,不是一个个遍历用equal判断,是通过哈希code值,模某个余数,然后找到这个位置,或者这个位置后几位,然后再针对这几个hashcode值一样的元素进行判断。

    但是注意,如果两个元素hashcode值取模后,余数一样,而且他们的值并不相同,那我们是把它俩放到一个索引下面吗?显然是不能的,那可以往后推一位吗,可以,但是这里不这么做,而是利用链表,即数组加单项链表。

    举例:

    首先注意 users类的hashcode没有重写哦!!!!!

     这里为什么u,u1都可以存进去呢,明明他俩一样的,但是呢,我们一直强调,判断是不是一样,在hashset里面是利用hashcode()来判断的,

     

     所以我们发现这两个u u1的hashcode并不相同,所以在hashset标准下被视为不一样的元素,实际上equals()根本没有执行.

     然后我们把users类的hashcode()重写一下试试看:

    当然重写的话,equals()也要一起重写的。

     

     然后在equals方法里加了sout"equals..."
     

    结果:

     发现这两个元素的hashcode一模一样了,所以只能添加一次。

    这就要求我们自定义类型时,记得要重写Hashcode方法哦

    3.HashSet底层源码

    hashset是利用hashmap实现的,所以我们主要会去看hashmap

    hashmap有两个重要的成员变量,其中hashmap是双例集合,key是任意,value是object的

    源码还是自己看吧,记笔记不方便,也不是很需要。

     比如这个add方法,我们发现都是放入之前那个hashmap变量,并且Key是e,value是present,这意味着key才是用到的,value随便给一个即可

    其他自己看吧,都是像这样自己观察的,对能力要求也不是很高。

    4.TreeSet

     treemap是Map接口的一个实现类,特点是支持对key进行排序。不过treemap重复元素依旧不允许出现。

    下面是使用:

    这里打印出来结果是a,b,c,侧面说明string类型中它已经实现了自身元素的排序规则了,字典序嘛。

     string类实现了一个接口comparable,那么在这个comparable里面,就给了一个定义排序规则的抽象方法:

     然后string里面实现了这个抽象方法(integer这种类也多半有排序规则):

     然后在Treeset的排序中,就会调用这个方法。

    这里主要说的是,如果是我们自己定义的类放到treeset中的情况

     首先,如果我们定义的类没有排序规则,放进去后会报错:

     出错了,类型转换异常

     这里我们的user并没有实现自身的比较接口comparable,我们也没有给它一个外部比较器,所以treeset无法做排序处理。

    那其中一个解决方法就是实现comparable,重写compareto,这里按年龄排序:

     注意哦,这个大小谁大谁小是完完全全我们自己定义的,最后treeset都是按从“小”到“大”排序。

    下面介绍使用比较器的方法:

    首先我们写了一个student类

     然后创建比较器类(实现了comparator接口

     这里的Object是默认的,可以改成student类型,然后里面写标记方法。

    使用的时候就是通过构造方法把比较器传递给treeset:

     如此即可。

    5.TreeSet底层源码

    也是了解即可,主要还是看treemap.

    下图可以看到如何一步步从map往下的(间接实现map接口)

     然后Treeset有两个成员变量:

     present就是用来填补value的,navigablemap基本可以就看作map

    然后我们可以看到一个无参,一个有参(比较器)的构造方法;

     

     add也都一样

  • 相关阅读:
    基于位置的 AR 应用程序开发最完整指南
    C++ day4
    携创教育:自考英语二相当于什么水平?可以不考吗?
    Qt 子窗口不设置parent时,如何随主窗口关闭
    AVS感知无损压缩标准概述——视觉无损质量等级视频浅压缩
    聊一聊DTM子事务屏障功能之SQL Server版
    oracle临时表
    (2) Java后端从0硬撸vite3+vue3+ts项目 | 规范
    系统集成|第十章(笔记)
    凌恩客户文章:河流弯道对城市河流生态异质性的直接和间接影响
  • 原文地址:https://blog.csdn.net/keepstrivingchy/article/details/126503470