源码分析-HashSet、LinkedHashSet
基本特性
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相关推荐
- 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...
- 【Java源码分析】LinkedHashSet和HashSet源码分析
类的定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...
- java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet
前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...
- Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet
2019独角兽企业重金招聘Python工程师标准>>> 这几天看了下容器的源码,总结一下HashSet vs TreeSet vs LinkedHashSet的区别, 如下图,col ...
- Java学习集合源码分析
集合源码分析 1.集合存在的原因 可以用数组来表示集合,那为什么还需要集合? 1)数组的缺陷 在创建数组时,必须指定长度,一旦指定便不能改变 数组保存必须是同一个类型的数据 数组的增加和删除不方便 ...
- HashSet及LinkedHashSet源码分析(基于JDK1.6)
Java容器类的用途是"保存对象",分为两类:Map--存储"键值对"组成的对象:Collection--存储独立元素.Collection又可以分为List和 ...
- java ee是什么_死磕 java集合之HashSet源码分析
问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...
- 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...
- HashSet源码分析
HashSet底层是HashMap实现的,关于HashMap的分析请移步到HashMap源码分析 属性 //底层使用HashMap来实现 private transient HashMap<E, ...
最新文章
- cutycapt(php截图工具)
- 蓝牙激光雕刻机android,迷你型激光雕刻机!私人定制随你玩
- 设计模式 - Command
- gitlab ci mysql_php-Gitlab CI:在阶段之间保留MySQL数据
- Core Audio音频基础概述
- Kafka : kafka重启报错 ZkClient allready closed
- 好爸爸陪宝宝必做的50件小事儿
- 小波变换 分离影像低频部分_连续小波变换(1)
- 用python定时自动发微博_Python 教你自动发微博,每日一句英语
- 计算机模拟试题生成,excel考试题库自动生成多套试题带独立答案页
- 产业互联网周报:中国移动:择时分拆业务上市;金山云CEO王育林辞职;谷歌负面缠身,数据中心爆炸又遭罚款...
- leetcode79 word serach 解题报告
- 宽带连接720错误代码解决办法
- 2023-2028年中国硫氰酸钠市场发展动态及前景预测报告
- 上穿均线压力的大阳线特征:
- HTML基础知识笔记-01
- C盘扩容 ~直接磁盘管理器不能扩展~bitlocker加密解除
- Material doesn‘t have a texture property ‘_MainTex
- 四选一单选按钮html实现
- 腾讯云服务器IP地址打不开网站注意80端口的问题
热门文章
- The LMAX disruptor Architecture--转载
- Lesson 13.3 梯度不平稳性与Glorot条件
- Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
- 小白看Word2Vec的正确打开姿势|全部理解和应用
- 微型计算机接口位于什么之间,io接口位于什么和什么之间
- 深入理解分布式技术 - 配置中心
- Redis进阶-Redis 4种MQ 方案对比
- Spring-WebApplicationContext解读
- android列表时间轴,Android实现列表时间轴
- java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...