基本特性
HashSet的是依靠组合一个HashMap实现的。然后讲大部分任务都委托给HashMap完成。 
当然,HashSet不保证迭代顺序与添加顺序相同,而且也不保证其顺序不变。允许空元素。 
对于其迭代器的迭代效率正比于(HashSet的内元素和HashSet的桶数量之和),因此如果对迭代效率要求比较高,就不要使用过大的初始大小。(这部分从HashSet本身的代码看不出来,今后分析HashMap的时候再说) 
对于同步特性,当然HashMap本身的不同步的,所以HashSet本身也不是线程安全的,所以如果要保证线程安全至少要用Set s = Collections.synchronizedSet(new HashSet(...));,当然还要注意使用同步包装器只是限制每次只能一个线程访问。 
对于迭代器使用的HashMap.keySet.iterator实现的,fail-fast迭代器。 
HashSet本身的内容很少。

如果将任务委托给HashMap
之前说过HashSet内置了一个HashMap的域变量,然后将所有的操作都委托给HashMap,这里的实现实际上就是先定义一个类静态变量的哑节点,就是PRESENT。然后将其作为HashMAP的值,然后将Set作为Key。这样就可以讲Set的认为委托给HashMap执行。

// Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
1
2
初始化
其实构造器也没有特别的地方,基本上都是把所有的认为委托给HashMap,但是HashSet有两种实现,分别是是HashSet和LinkedHashSet,也分别对应了HashMap和LinkedHashMap的实现 
为了区别这两者HashSet中实现了一个默认访问权限的构造器,然后让LinkedHashSet继承HashSet。如果需要使用LinkedHashSet则只要在LinkedHashSet中使用构造器然后在尾部加上true(其实加上false也可以)就可以使用LinkedHashMap来实现。

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
1
2
3
LinkedHashSet
基本特性
这里与HashSet不同使用了一个双端队列实现HashSet。从而实现了有序的排列。LinkedHashSet维护的是插入顺序,而且不受重复插入的影响,也就是仅仅以第一次插入操作为准。

客户端的散列实没有特殊指定,通常使用HashSet的散列顺序,而使用TreeSet则会有稍高的代价。这样当如果复制元素时依然会保持原先的顺序,通常符合使用者习惯。这句话其实我不是很理解。

LinkedHashSet是HashSet的子类,允许空元素,插入包含删除操作有常数时间复杂度,但是时间会稍多于HashSet因为需要维护双端队列。

当然LinkedHashSet的性能会收到初始大小和装填因子的影响,但是和HashSet有些不同,HashSet元素迭代性能消耗并不受容量的影响,因此初始大小的惩罚没有HashSet这么大。

实现
实现上实际上没有任何特殊的地方。只是重写了构造器。还利用了HashSet的构造器。
--------------------- 
作者:千念飞羽 
来源:CSDN 
原文:https://blog.csdn.net/u011518120/article/details/53356076 
版权声明:本文为博主原创文章,转载请附上博文链接!

源码分析-HashSet、LinkedHashSet相关推荐

  1. 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  2. 【Java源码分析】LinkedHashSet和HashSet源码分析

    类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  3. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  4. Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet

    2019独角兽企业重金招聘Python工程师标准>>> 这几天看了下容器的源码,总结一下HashSet vs TreeSet vs LinkedHashSet的区别, 如下图,col ...

  5. Java学习集合源码分析

    集合源码分析 1.集合存在的原因 可以用数组来表示集合,那为什么还需要集合? 1)数组的缺陷 ​ 在创建数组时,必须指定长度,一旦指定便不能改变 数组保存必须是同一个类型的数据 数组的增加和删除不方便 ...

  6. HashSet及LinkedHashSet源码分析(基于JDK1.6)

    Java容器类的用途是"保存对象",分为两类:Map--存储"键值对"组成的对象:Collection--存储独立元素.Collection又可以分为List和 ...

  7. java ee是什么_死磕 java集合之HashSet源码分析

    问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...

  8. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  9. HashSet源码分析

    HashSet底层是HashMap实现的,关于HashMap的分析请移步到HashMap源码分析 属性 //底层使用HashMap来实现 private transient HashMap<E, ...

最新文章

  1. cutycapt(php截图工具)
  2. 蓝牙激光雕刻机android,迷你型激光雕刻机!私人定制随你玩
  3. 设计模式 - Command
  4. gitlab ci mysql_php-Gitlab CI:在阶段之间保留MySQL数据
  5. Core Audio音频基础概述
  6. Kafka : kafka重启报错 ZkClient allready closed
  7. 好爸爸陪宝宝必做的50件小事儿
  8. 小波变换 分离影像低频部分_连续小波变换(1)
  9. 用python定时自动发微博_Python 教你自动发微博,每日一句英语
  10. 计算机模拟试题生成,excel考试题库自动生成多套试题带独立答案页
  11. 产业互联网周报:中国移动:择时分拆业务上市;金山云CEO王育林辞职;谷歌负面缠身,数据中心爆炸又遭罚款...
  12. leetcode79 word serach 解题报告
  13. 宽带连接720错误代码解决办法
  14. 2023-2028年中国硫氰酸钠市场发展动态及前景预测报告
  15. 上穿均线压力的大阳线特征:
  16. HTML基础知识笔记-01
  17. C盘扩容 ~直接磁盘管理器不能扩展~bitlocker加密解除
  18. Material doesn‘t have a texture property ‘_MainTex
  19. 四选一单选按钮html实现
  20. 腾讯云服务器IP地址打不开网站注意80端口的问题

热门文章

  1. The LMAX disruptor Architecture--转载
  2. Lesson 13.3 梯度不平稳性与Glorot条件
  3. Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
  4. 小白看Word2Vec的正确打开姿势|全部理解和应用
  5. 微型计算机接口位于什么之间,io接口位于什么和什么之间
  6. 深入理解分布式技术 - 配置中心
  7. Redis进阶-Redis 4种MQ 方案对比
  8. Spring-WebApplicationContext解读
  9. android列表时间轴,Android实现列表时间轴
  10. java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...