【Java】Java容器类(三),深入理解Set集合类

【Java】Java容器类(三),深入理解Set集合类

建议整个系列一起看(更新中):
增强for: https://blog.csdn.net/qq_45495857/article/details/109410980
泛型:https://blog.csdn.net/qq_45495857/article/details/109410912
Java容器篇(一),宏观了解:https://blog.csdn.net/qq_45495857/article/details/109524162
Java容器篇(二),深入理解List集合类: https://blog.csdn.net/qq_45495857/article/details/109529618
Java容器类(三),深入理解Set集合类: https://blog.csdn.net/qq_45495857/article/details/109536611
Java容器类(四),深入理解Map集合类https://blog.csdn.net/qq_45495857/article/details/109542428
Java容器类(五),深入理解迭代器: https://blog.csdn.net/qq_45495857/article/details/109548598

在这里插入图片描述

Set接口

继承自Collection

特点:

  • 元素无序(存入和取出的顺序不一致)
  • 元素不能重复(元素唯一)
  • 没有索引

注意:

  • 无序:指定的是存入的顺序和取出的顺序不一样,而不是说每次取出是随机顺序,存入后每次取出来的顺序都一样,但和存入的顺序不一样
  • 直接打印和获取元素都属于取出,所以不要把打印当成是HashSet内部存储的样子

Set具有与Collection完全一样的 接口,因此没有任何额外的功能,不像前面有两个不同的List,实际上Set就是Collection,只是行为不同。

这是继承 和 多态思想的典型应用;表现不同的行为

HashSet

  • 底层使用散列函数
  • 专为快速查找而设计的Set

底层源码:
在这里插入图片描述
我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是在map中增加一个键值对,键对象就是这个元素,值对象是名为PRESENT的Object对象。说白了,就是“往set中加入元素,本质就是把这个元素作为key加入到了内部的map中”。

由于map中key都是不可重复的,因此,Set天然具有“不可重复”的特性。

HashSet保证元素唯一性的原理

判断对象是否相同要根据2个方法:

  1. hashCode()
  • 如果判定哈希值不相同, 则认为不重复
  • 如果判定哈希值相同, 则需要继续使用equals()方法判断
  1. equals()
  • 如果判定不相同, 则认为不重复
  • 如果判定相同, 则认为重复

TreeSet

  • 内部使用了红-黑树数据结构
  • 自动排序
  • 排序按照字典序进行

TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。

易错:

  • 由于是二叉树,需要对元素做内部排序。 如果要放入TreeSet中的类没有实现Comparable接口,则会抛出异常:java.lang.ClassCastException。
  • TreeSet中不能放入null元素。

LinkedHashList

  • 同样使用到了散列,但是看起来使用了链表来维护元素的插入顺序
  • 其他同HashSet

Set集合遍历方式

  1. foreach
  2. 迭代器
  3. 转换成数组,再for循环遍历

//以上就是本期Set集合的所有内容了,不对之处,欢迎各位大佬多多指点

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GengMS_DEV

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值