Java容器之set

发布于:2022-12-30 ⋅ 阅读:(256) ⋅ 点赞:(0)

目录

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也都一样

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到