前两篇文章分别分析了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相关推荐

  1. java地图源码_Java集合源码分析(四)HashMap

    一.HashMap简介 1.1.HashMap概述 HashMap是基于哈希表的Map接口实现的,它存储的是内容是键值对映射.此类不保证映射的顺序,假定哈希函数将元素适当的分布在各桶之间,可为基本操作 ...

  2. java list addall源码_Java集合:ArrayList源码分析

    其实我看到已有很多大佬写过此类文章,并且写的也比较清晰明了,那我为何要再写一遍呢?其实也是为了加深本身的印象,巩固本身的基础html (主要是不少文章没有写出来我想知道的东西!!!​!!!!)java ...

  3. 【JDK源码】集合源码目录,冲冲冲

    集合源码直达,冲冲冲 [JDK源码]集合之ArrayList [JDK源码]集合之LinkedList [JDK源码]集合之解决ArrayList线程不安全 [JDK源码]集合之CopyOnWrite ...

  4. hashset java 键值对_Java集合 - HashSet的定义以及用法

    HashSet的定义 HashSet类实现了Set接口,由一个实际上是HashMap实例的散列表​支持.不能保证该集合的迭代次序,这意味着该类不能保证元素随时间的不变顺序.这个类允许null元素.该类 ...

  5. java list取值_Java集合详解

    一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...

  6. java 数组合并 去重_Java集合与数组去重

    集合去重 方法一:利用集合的contains方法,创建临时集合组装数据去重 public void listTest1(){ System.out.println("方法一"); ...

  7. java的set接口_Java集合-Set接口

    importorg.junit.Test;import java.util.*;/*** * Collection接口:单列集合,用来存储一个一个的对象 * (不常用)子接口Set:存储无序的.不可重 ...

  8. java hashset 源码_Java集合:HashSet的源码分析

    1 public class HashSet 2 extends AbstractSet 3 implements Set, Cloneable, java.io.Serializable 4{ 5 ...

  9. java linkedlist源码_Java集合之LinkedList源码分析

    一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...

最新文章

  1. Android入门教程 (二) 第一个App HelloWorld
  2. linux之history命令
  3. 清除linux缓存命令
  4. 删除linux目录下一半的文件,Linux面试题(一):删除一个目录下的所有文件,但保留一个指定文件...
  5. 【Antlr】rule expr: must label all alternatives or none
  6. java抽象机制_Java很好学:接口+抽象类+事件监听机制
  7. 使用线程池应该注意的问题
  8. html图像排列代码,HTML图像(示例代码)
  9. 《图解HTTP》学习笔记
  10. for 循环 与forEach 里面return 的区别
  11. BraftEditor:React使用编辑器编辑的时候,在服务器上删除文字中不存在的图片
  12. 人人商城前端小程序如何配置使用教程
  13. SwitchHost自动配置Github520
  14. 信号量机制(P,V操作)
  15. 常见的统计图表及其应用
  16. 新一批交通强国试点工作启动
  17. 查看用友NC的版本方法(不启动NC,只看NCHOME)
  18. windows的Alt键一直处于按下状态,解决,亲测有用
  19. 13计算机组装,舞阳中专2012-13年度《计算机组装与维修》期中考试试题
  20. Envato不停机迁移边缘网络提供商

热门文章

  1. scanf———while(scanf (%lu,num) = =1)什么意思
  2. 在kindle fire 上安装CM10 Jelly Bean ROM
  3. 安全实现Linux网络监控(1)
  4. ISA Server出现12250错误的解决方法
  5. 利用BIND 9基于电信网通智能DNS 搭建
  6. 随手小记:快速适应未必是个好策略
  7. 【MM配置】Master Data 主数据的配置
  8. Field-Symbols总结
  9. SAPCAR 压缩解压软件的使用方法
  10. 项目管理的十大谈判必杀技