JDK源码分析(五)——HashSet
HashSet概述
从前面开始,已经分析过集合中的List和Map,今天来介绍另一种集合元素:Set。这是JDK对HashSet的介绍:
This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.
大意是HashSet实现了Set接口,实际上是借助HashMap来实现的,HashSet不保证迭代时顺序,也不保证存储的元素的顺序保持不变。HashSet允许插入Null。介绍了HashSet的两个特点:无序,允许插入空值。
继承结构

- Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。
- HashSet继承AbstractSet,Abstract继承于AbstractCollection,AbstractCollection实现了Set中的绝大部分函数,为Set的实现类提供了便利。HashSet实现Set接口借助了HashMap。
内部字段及构造方法
内部字段
//序列化
static final long serialVersionUID = -5024744406713321676L;
//通过HashMap实例实现Set接口
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
//存入HashMap中键值对的值
private static final Object PRESENT = new Object();
构造方法
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);
}
存储元素
调用了HashMap的put方法插入以插入元素e为键,Object对象PRESENT为值的键值对,通过比较返回值是否为null判断插入是否成功,因为HashMap的put方法插入的键值对已经存在,那么它会返回键值对的值,也就是PRESENT;如果不存在就返回null。从而实现不能插入重复值。HashMap的put方法返回:the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key.)
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
删除元素
调用HashMap的remove方法
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
包含元素
调用HashMap的containsKey方法查找是否存在以当前元素作为key的键值对
public boolean contains(Object o) {
return map.containsKey(o);
}
总结
HashSet比较简单,它存储元素是无序的,可以插入null,基于HashMap实现,所以它也是线程不安全的。
JDK源码分析(五)——HashSet的更多相关文章
- 源码分析五(HashSet的内部实现)
一:首先来看看Hashset的继承体系 public class HashSet<E> extends AbstractSet<E> implements Set<E&g ...
- JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue
JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlocki ...
- JDK 源码分析(4)—— HashMap/LinkedHashMap/Hashtable
JDK 源码分析(4)-- HashMap/LinkedHashMap/Hashtable HashMap HashMap采用的是哈希算法+链表冲突解决,table的大小永远为2次幂,因为在初始化的时 ...
- JDK源码分析(三)—— LinkedList
参考文档 JDK源码分析(4)之 LinkedList 相关
- JDK源码分析(一)—— String
dir 参考文档 JDK源码分析(1)之 String 相关
- JDK源码分析(2)LinkedList
JDK版本 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator
一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JD ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList
一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...
随机推荐
- Asp.Net使用加密cookie代替session验证用户登录状态 源码分享
首先 session 和 cache 拥有各自的优势而存在. 他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段 本实例采用vs2010编写 ...
- Infinite Fraction Path(HDU6223 + bfs + 剪枝)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6223 题目: 题意: 给你一个长度为n的数字串,开始时你选择一个位置(记为i,下标从0开始)做为起点 ...
- exec操作文件描述符
exec命令可以用来替代当前shell:换句话说,并没有启动子shell.使用这一命令时任何环境都将被清除,并重新启动一个shell. 它的一半形式为: exec command 其中,command ...
- 关于UDP数据报引发“异步错误”的疑问
在UNP卷一第三版的第8章8.9小节中说到:如果udp服务器没有启动,udp客户端在使用sendto发送一行文本后,将会等待一个永远也不会出现的应答从而阻塞在recvfrom调用上. 由于服务器段不存 ...
- 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155303 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...
- weblogica 目录结构 简单介绍 创建domain domain所在目录
1. samples 创建过程略过 domain的目录 [weblogic@node2 base_domain]$ pwd /home/weblogic/Oracle/Middleware/Oracl ...
- 怎么修改oracle用户密码
在以SYSDBA身份登陆时可以修改其他用户的密码,比如: SQL> alter user user01 identified by user10;
- C# 反射获取和设置值
/// <summary> /// 遍历泛型 /// </summary> /// <typeparam name="T"></typep ...
- PCI学习之总线原理01
-----------以下资料由网络资料整理而成-------- PCI即Peripheral Component Interconnect,中文的意思是“外围器件互联”. PCI总线支持32位和64 ...
- gcc编译选项【转】
转自:https://blog.csdn.net/rheostat/article/details/19811407 常用选项 -E:只进行预处理,不编译-S:只编译,不汇编-c:只编译.汇编,不链接 ...