Java集合——HashSet、TreeSet源码

Set的实现是很简单的,但是这个简单的基础是建立在对于Map关键是HashMap的理解

一、基础知识概述

1、Set不能够方重复元素但是可以添加一个null(并不是所有的Set都可以例如TreeMap的就不行),这里应该是开启了HashMap的putVal方法中的后两个参数

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {}

2、Set接口对象存放的是无序的,但是取出的顺序是有序的(不是添加的顺序但是也是固定的)

因为继承了Conllection所以可以使用迭代器的方式来进行遍历,同时也可以使用增强for循环的方式来实现——增强for循环底层使用的就是迭代器相关的原理

3、Set接口对象不能通过索引的方式来获取

4、TreeSet不能够存在null而HashSet可以:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

但是在TreeSet的背后实现的TreeMap中不能够空指针的这一段是这样实现的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7IRFMOoT-1639916898836)(F:\typroa\aimages\image-20211219192152648.png)]

二、HashSet源码解析

HashSet的底层实际上是HashMap:

public HashSet() {
    map = new HashMap<>();
}

关于HashMap的相关知识就不再探讨,这里主要了解的是HashSet中对于Map的使用,以及是如何实现不重复元素的存储,在HashSet的add方法中调用的是map的put方法:

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

并且他传递进去的value都是一个固定的:

private static final Object PRESENT = new Object();

之后调用的就完全是HashMap的put方法,set的值都是存放在Key中,实际上在HashMap的结构中每一次value也是发生了改变的不过他们都是相同的值PRESENT。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNA3x8ty-1639916898838)(F:\typroa\aimages\image-20211219170320031.png)]

三、TreeSet源码解析

TreeSet是可排序的,当我们使用无参构造器创建TreeSet时,仍然是无序的。但是我们可以通过使用带有比较器的构造函数来进行创建,这样我们创建出来的TreeSet集合就会是有序的了

public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

在TreeMap中将构造函数中传递过来的比较器付给了一个类中的全局变量:

private final Comparator<? super K> comparator;
public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
}

这里面着重要理解的有TreeSet的数据结构与HashMap的数据结构有何不同、通过比较器可以发现我们通过穿进去适当的比较器是可以改变Set不重复的这个规则的,那么这个规则是如何起作用的?

1、想要了解TreeSet就首先要了解TreeMap

TreeMap中简单使用了红黑树的结构,由于他没有使用Hash所以他对于树形的判断依靠的是比较器,这一点是可以通过代码看出来的:
在这里插入图片描述
这一部分在TreeSet中的体现就是如果要是没有发生冲突正常插入了那么程序是会放回一个null,经过set相关的方法处理就变成了true表示我们的元素插入成功,如果要是没有插入成功,则会返回元素的原有值,从而通过set 中的判断会返回一个false

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

2、TreeSet的数据结构与HashMap的数据结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Utrij9S8-1639916898840)(F:\typroa\aimages\image-20211219172816788.png)]

四、Collections

了解了Collections的功能之后之后的使用我们可以直接查看他的API,从而来指导Collections有哪些能力:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值