Java集合框架(十三):HashSet 源码分析 2022-05-28 12:25 180阅读 0赞 ### 文章目录 ### * * 1、简述 * 2、HashSet实现 * 3、常用方法 * 4、HashSet元素不重复原理 ## 1、简述 ## HashSet继承于AbstractSet,实现接口Set,内部使用HashMap来存储数据,数据存储在HashMap的key中,value只是同一个默认值,所以HashSet存储的值是不能重复的。 ## 2、HashSet实现 ## HashSet几乎实现了Set接口中的所有方法,在此我们不对每一个方法进行介绍,只介绍一部分重要方法和属性。首先我们看一下HashSet的构造方法,了解一下HashSet是如何构建的 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NDcwMzU_size_16_color_FFFFFF_t_70] private transient HashMap<E,Object> map; // PRESENT则是用来虚拟一个假的value,作为Map的值 private static final Object PRESENT = new Object(); /** * 使用HashMap构造一个空的HashSet对象,初始容量为16,负载因子为0.75,相当于初始化一个空的HashMap对象 */ public HashSet() { map = new HashMap<>(); } /** * 构造包含指定集合中的元素的新集合 * 创建一个HashMap对象,默认负载因子是0.75,容量大小取指定集合和默认初始大小16中最大值 */ public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } /** * 根据指定容量大小和指定的负载因子,基于HashMap创建一个空的HashSet */ public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } /** * 根据指定初始容量大小,基于HashMap创建一个空的HashSet,默认负载因子为0.75 */ public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } ## 3、常用方法 ## /** * 返回集合中元素数量,注意map.size(),实际是map中元素的数量 */ public int size() { return map.size(); } /** * 判断集合中是否抱恨指定的元素,实际判断map中是否包含指定元素作为key的对象 */ public boolean contains(Object o) { return map.containsKey(o); } /** *将指定元素添加到集合中,该元素作为map中的key,PRESENT作为值 */ public boolean add(E e) { return map.put(e, PRESENT)==null; } /** * 从集合中移除指定的元素 */ public boolean remove(Object o) { return map.remove(o)==PRESENT; } ## 4、HashSet元素不重复原理 ## 由源码分析中add()方法可知,HashSet集合中添加元素,实际是作为HashMap的Key存储, 由于 HashMap 的 put() 方法添加 key-value 时,当新放入 HashMap 的 Entry 中 key 与集合中原有 Entry 的 key 相同(hashCode()返回值相等,通过 equals 比较也返回 true),新添加的 Entry 的 value 会将覆盖原来 Entry 的 value,但 key 不会有任何改变,因此如果向 HashSet 中添加一个已经存在的元素时,新添加的集合元素将不会被放入 HashMap中,原来的元素也不会有任何改变,这也就满足了 Set 中元素不重复的特性。 如果添加元素在 HashSet 中不存在的,则返回 true;如果添加的元素已经存在,返回 false。其原因在于 HashMap 的 put 方法。该方法在添加 key 不重复的键值对的时候,会返回 null。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NDcwMzU_size_16_color_FFFFFF_t_70]: /images/20220528/1fc42c3431a84afd95bb1878e5598321.png
相关 JAVA集合Set之HashSet源码分析 1、概述 HashSet是Java集合的Set的实现类,实际上底层它是HashMap,Set是无序的、不可重的.其中无序的含义是:添加到集合中和取出顺序不一致.可以存放n 红太狼/ 2022年10月17日 04:24/ 0 赞/ 140 阅读
相关 【集合】HashSet 源码分析 前言 Github:[https://github.com/yihonglei/jdk-source-code-reading][https_github.com_yih 深碍√TFBOYSˉ_/ 2022年10月05日 08:50/ 0 赞/ 148 阅读
相关 Java集合---HashSet的源码分析 一、 HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变 清疚/ 2022年06月01日 12:19/ 0 赞/ 151 阅读
相关 Java集合框架(十三):HashSet 源码分析 文章目录 1、简述 2、HashSet实现 3、常用方法 4、HashSet元素不重复原理 1、简述 Has 悠悠/ 2022年05月28日 12:25/ 0 赞/ 181 阅读
相关 Java集合框架(三):Collection 源码分析 文章目录 Collection接口类图 Iterable源码分析 Collection接口源码分析 本文我们主要学习Jav ╰+哭是因爲堅強的太久メ/ 2022年05月28日 07:18/ 0 赞/ 139 阅读
相关 Java从入门到放弃(十三)集合框架之HashSet源码 HashSet是Set集合的一种,Set集合是一种不允许出现重复值的集合,可以用来作为去重。 1、构造函数 private transi 女爷i/ 2022年05月25日 04:11/ 0 赞/ 109 阅读
相关 Java集合框架(十六):ArrayList 源码分析 文章目录 1、ArrayList 简述 2、ArrayList 类图 3、ArrayList 构造函数 3.1 向右看齐/ 2022年04月24日 03:04/ 0 赞/ 213 阅读
相关 Java集合框架(十一):Map 源码分析 文章目录 1、Map 简述 2、Map 类图 3、Map 方法说明 1、Map 简述 java.util.Map 接口表示 水深无声/ 2022年04月23日 23:26/ 0 赞/ 245 阅读
相关 源码解析java集合框架,HashSet源码 一、HashSet解读 在讲HashSet底层数据结构之间我们不妨先来浏览下HashSet的源码,因为它很懒,为什么说它懒,是因为它底层是用的HashMap,没有自己的实 谁践踏了优雅/ 2022年02月27日 03:16/ 0 赞/ 238 阅读
相关 Java集合框架(十):Deque 源码分析 文章目录 1、Deque 简述 2、Deque 类图 3、Deque 方法概述 1、Deque 简述 线性集合,支持两端插 心已赠人/ 2022年02月23日 10:18/ 0 赞/ 251 阅读
还没有评论,来说两句吧...