文章目录

  • 2 Set接口
    • 2.1Set概述
    • 2.2 Set实现类:HashSet
      • 2.2.1 HashMap
    • 2.2.3 LinkedHashSet

2 Set接口

2.1Set概述

一个不包含重复元素的 collection。更确切地讲, set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2, 并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
注意事项:Set 集合并不一定都是无序的,有些 Set 集合是有序的。

2.2 Set实现类:HashSet

  • 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。
  • 它不保证 set的迭代顺序;特别是它不保证该顺序恒久不变。
  • 此类允许使用 null 元素。
  • 注意,此实现不是同步的。
  • HashSet 是如何保证元素的唯一性的呢?(Set 存储的元素是作为 Map 的 key)
    HashSet依赖存储对象的equals()和hashCode()
  • 千万不要修改 HashSet 元素的属性值!

2.2.1 HashMap

HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。(其实所谓Map其实就是保存了两个对象之间的映射关系的一种集合。
Entry是HashMap中的一个静态内部类。

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(L),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

当发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。

HashMap的数组长度一定保持2的次幂,比如16的二进制表示为 10000,那么length-1就是15,二进制为01111,同理扩容后的数组长度为32,二进制表示为100000,length-1为31,二进制表示为011111。从下图可以我们也能看到这样会保证低位全为1,而扩容后只有一位差异,也就是多出了最左位的1,这样在通过 h&(length-1)的时候,只要h对应的最左边的那一个差异位为0,就能保证得到的新的数组索引和老数组索引一致(大大减少了之前已经散列良好的老数组的数据位置重新调换)

2.2.3 LinkedHashSet

  • 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
  • 此实现与 HashSet的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。
  • HashSet 的子类
  • 底层是HashMap & 双向链表
  • HashMap 的HashCode方法保证了元素的唯一性
  • 链表定义了迭代的顺序,按照元素的插入顺序进行迭代
  • 不同步

Phase2 Day10 Tree3Set相关推荐

  1. 必背单词_研究生满大街走?真实数据来啦 真题必背单词Day10

    研究生满大街走?真实数据来啦 我国现在有多少研究生了?先上图: 从以上数据可以得知,1995年至2019年,我国的研究生入学人数共计约878万人. 这个数字看似很大,但不要忽视了我国的总人口.简单计算 ...

  2. Java基础day10

    Java基础day10 Java基础day10-继承&修饰符 1 继承 1.1 继承的实现 1.2 继承的好处和弊端 2. 继承中的成员访问特点 2.1 继承中变量的访问特点 2.2 supe ...

  3. 第二课 运算符(day10)

    第二课    运算符(day10) 一.运算符 结果是值 算数运算 a = 10 * 10 赋值运算 a = a + 1    a+=1 结果是布尔值 比较运算 a = 1 > 5 逻辑运算 a ...

  4. Day10:html和css

    Day10:html和css <html> <body> <h1>标题</h1> <p>段落</p> </body> ...

  5. LeetCode算法入门- 3Sum Closest -day10

    LeetCode算法入门- 3Sum Closest -day10 Given an array nums of n integers and an integer target, find thre ...

  6. spss典型相关分析_R语言实战 多元统计分析Day10— —典型相关分析

    R语言实战多元统计分析Day10-- 典型相关分析 01 前言 典型相关分析是用于分析两组随机变量之间的相关性程度的一种统计方法,它能够有效的揭示两组随机变量之间的相互线性依赖关系,这种方法是由Hot ...

  7. 句句真研—每日长难句打卡Day10

    句句真研-每日长难句打卡Day10 参考译文:这段情节证明了具有讽刺意味的现象确实存在:尽管美国男性倾向于在公共场合比女性健谈,在家里却比妻子话少.

  8. Python菜鸟入门:day10模块介绍

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  9. day10【过渡】分布式理论

    day10[过渡]分布式理论 划水课,参考老师的课件即可

  10. 21天Jmeter打卡Day10线程用户之setUp和tearDown

    21天Jmeter打卡Day10线程用户之setUp和tearDown 其实学过unittest,就知道setup和teardown分别是测试类的初始准备工作和结束工作. 另外发现查看结果树,可以只添 ...

最新文章

  1. 【Salvation】——登录注册存储数据验证用户
  2. 语言毕业设计选题及源代码_区块链毕业设计论文「11」
  3. php函数有哪三种,【后端开发】php函数可以分为哪三种
  4. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第7章-保性能控制
  5. 【数据竞赛】Kaggle竞赛如何保证线上线下一致性?
  6. java非必填字段跳过校验,avalon2表单验证,非必填字段在不填写的时候不能通过验证...
  7. Python字典values()方法与示例
  8. JAVA 自定义注解在自动化测试中的使用
  9. 【递归练习】阿克曼函数
  10. 进销存excel_(升级版)进销存管理系统,含Excel函数公式全自动,高效率
  11. Multisim基础 桥式整流二极管电路
  12. 根据日期算星座 mysql_php根据日期获取星座
  13. Pwnable.kr collision [Writeup]
  14. 机器学习之决策树CART算法
  15. 趁年轻,多尝试一些富有挑战的工作吧
  16. BLAM源码解析(一)—— 模块初始化
  17. 编写代码实现对多边形图案填充
  18. 单核处理器、多核处理器、多处理器与多线程编程
  19. 【算法】实现打印汉字拼音首字母
  20. capp PHP,开目CAPP通用框架

热门文章

  1. linux 切换内核版本,切换 Linux 内核版本
  2. 使用Python解二元一次方程组
  3. chrome强烈推荐安装Octotree插件
  4. 几种物流业务的凭证模板设置说明
  5. 红外视觉1:近红外与中远红外图像
  6. JavaScript运算符优先级需要记吗
  7. 如何用Java解压缩WAR文件
  8. centos 5.6 x86 安装 文泉驿字体
  9. 还挺好看!用命令行画思维导图;66天机器学习之旅;斯坦福CS234 强化学习课程;哈佛CS50 计算机科学导论课程;前沿论文 | ShowMeAI资讯日报
  10. 认证杯网络挑战赛C题破局共享汽车