java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet
前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码。重点讲解HashSet,因为LinkedHashSet是继承自HashSet,只是它的成员变量map类型是LinkedHashMap而不是HashMap。
HashSet和LinkedHashSet只能使用Iterator进行遍历(解释下foreach底层实现也是基于Iterator),而在Java的java.util包下的集合框架中,所有的Iterator遍历都是fail-fast的,java.util.concurrent包下的集合框架中,所有的Iterator遍历都是fail-safe的。
HashSet类图
HashSet类图
HashSet只有两个成员变量:map: HashMap和PRESENT: Object,所以操作函数都是通过map实现的,PRESENT: Object是指map所有key的value都是PRESENT: Object。
HashSet实现Set接口,是一个不包含重复元素的一个无序的集合,允许使用null,最多允许一个元素为null。
HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装!
Set s = Collections.synchronizedSet(new HashSet(...));
HashSet构造器
HashSet的构造器比较多,共提供了5个:
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
请注意第5个构造器,它的第三个参数表示是LinkedHashSet调用的,那么将map的类型改为LinkedHashMap。
HashSet核心操作
HashSet核心操作包括:
size():int
add(E):boolean
remove(o:Object):boolean
contains(o:Object):boolean
iterator():Iterator
clone():Object
size():int
public int size() {
return map.size();
}
add(E):boolean
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
其实调用的是HashMap的put方法。
remove(o:Object):boolean
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
其实调用的是HashMap的remove方法。
contains(o:Object):boolean
public boolean contains(Object o) {
return map.containsKey(o);
}
其实调用的是HashMap的contains方法。
iterator():Iterator
public Iterator iterator() {
return map.keySet().iterator();
}
可以看出,HashSet的迭代器就是HashMap的key的迭代器,而且跟ArrayList和LinkedList一样是fail-fast的。
clone():Object
public Object clone() {
try {
HashSet newSet = (HashSet) super.clone();
newSet.map = (HashMap) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
克隆出一个新的HashSet,注意是浅拷贝。
LinkedHashSet
LinkedHashSet继承自HashSet,源码更少、更简单,唯一的区别是LinkedHashSet内部使用的是LinkHashMap。这样做的意义或者好处就是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。
java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet相关推荐
- java地图源码_Java集合源码分析(四)HashMap
一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...
- java list addall源码_Java集合:ArrayList源码分析
其实我看到已有很多大佬写过此类文章,并且写的也比较清晰明了,那我为何要再写一遍呢?其实也是为了加深本身的印象,巩固本身的基础html (主要是不少文章没有写出来我想知道的东西!!!!!!!)java ...
- 【JDK源码】集合源码目录,冲冲冲
集合源码直达,冲冲冲 [JDK源码]集合之ArrayList [JDK源码]集合之LinkedList [JDK源码]集合之解决ArrayList线程不安全 [JDK源码]集合之CopyOnWrite ...
- hashset java 键值对_Java集合 - HashSet的定义以及用法
HashSet的定义 HashSet类实现了Set接口,由一个实际上是HashMap实例的散列表支持.不能保证该集合的迭代次序,这意味着该类不能保证元素随时间的不变顺序.这个类允许null元素.该类 ...
- java list取值_Java集合详解
一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...
- java 数组合并 去重_Java集合与数组去重
集合去重 方法一:利用集合的contains方法,创建临时集合组装数据去重 public void listTest1(){ System.out.println("方法一"); ...
- java的set接口_Java集合-Set接口
importorg.junit.Test;import java.util.*;/*** * Collection接口:单列集合,用来存储一个一个的对象 * (不常用)子接口Set:存储无序的.不可重 ...
- java hashset 源码_Java集合:HashSet的源码分析
1 public class HashSet 2 extends AbstractSet 3 implements Set, Cloneable, java.io.Serializable 4{ 5 ...
- java linkedlist源码_Java集合之LinkedList源码分析
一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...
最新文章
- Android入门教程 (二) 第一个App HelloWorld
- linux之history命令
- 清除linux缓存命令
- 删除linux目录下一半的文件,Linux面试题(一):删除一个目录下的所有文件,但保留一个指定文件...
- 【Antlr】rule expr: must label all alternatives or none
- java抽象机制_Java很好学:接口+抽象类+事件监听机制
- 使用线程池应该注意的问题
- html图像排列代码,HTML图像(示例代码)
- 《图解HTTP》学习笔记
- for 循环 与forEach 里面return 的区别
- BraftEditor:React使用编辑器编辑的时候,在服务器上删除文字中不存在的图片
- 人人商城前端小程序如何配置使用教程
- SwitchHost自动配置Github520
- 信号量机制(P,V操作)
- 常见的统计图表及其应用
- 新一批交通强国试点工作启动
- 查看用友NC的版本方法(不启动NC,只看NCHOME)
- windows的Alt键一直处于按下状态,解决,亲测有用
- 13计算机组装,舞阳中专2012-13年度《计算机组装与维修》期中考试试题
- Envato不停机迁移边缘网络提供商