JDK 1.8源码阅读 HashSet
一,前言
类实现Set接口,由哈希表支持(实际上是一个 HashMap集合)。HashSet集合不能保证的迭代顺序与元素存储顺序相同。HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
二,HashSet结构
2.1 什么是哈希表
哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。
当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。
2.2 哈希表存储结构

三,HashSet源码阅读
3.1 HashSet的继承关系
   
3.2 HashSet的构造方法
public HashSet() {}  // 一个空的构造函数,new一个hashMap对象实例出来。默认初始容量是16 加载因子是0.75,
public HashSet(Collection<? extends E> c) {} // 将一个新的collection转换为一个HashSet集合
public HashSet(int initialCapacity, float loadFactor) {} // 自己初始化容量和加载因子的大小
public HashSet(int initialCapacity) {} // 初始化容量大小,加载因子用默认的
3.3 HashSet的常用方法
public Iterator<E> iterator() {}  // 转化成迭代器
public int size() {} // 基础集合长度
public boolean isEmpty() {} // 判断是否为空
public boolean contains(Object o) {} // 判断对象是否存在
public boolean add(E e) {} // 添加
public boolean remove(Object o) {} // 删除
public void clear() {} // 清空
@SuppressWarnings("unchecked")
public Object clone() {} // 克隆
/**
 * @since 1.8
 */
public Spliterator<E> spliterator() {} // 1.8
四,总结
保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。它是一个无序的集合(元素存与取的顺序可能不同),它不能存储重复的元素
JDK 1.8源码阅读 HashSet的更多相关文章
- JDK 1.8 源码阅读和理解
		根据 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础” 的指引,决定开始阅读下JDK源码. 本文将作为源码阅读总纲 一.精读部分 java.io java.lang java.util ... 
- JDK 1.8源码阅读  TreeMap
		一,前言 TreeMap:基于红黑树实现的,TreeMap是有序的. 二,TreeMap结构 2.1 红黑树结构 红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗 ... 
- JDK 1.8源码阅读  HashMap
		一,前言 HashMap实现了Map的接口,而Map的类型是成对出现的.每个元素由键与值两部分组成,通过键可以找对所对应的值.Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值. 存储数 ... 
- JDK 1.8源码阅读  LinkList
		一,前言 LinkedList是一个实现了List接口和Deque接口的双端链表.有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedL ... 
- JDK 1.8源码阅读  ArrayList
		一,前言 ArrayList是Java开发中使用比较频繁的一个类,通过对源码的解读,可以了解ArrayList的内部结构以及实现方法,清楚它的优缺点,以便我们在编程时灵活运用. 二,ArrayList ... 
- java源码阅读HashSet
		1类签名与注解 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneabl ... 
- jdk源码阅读笔记-HashSet
		通过阅读源码发现,HashSet底层的实现源码其实就是调用HashMap的方法实现的,所以如果你阅读过HashMap或对HashMap比较熟悉的话,那么阅读HashSet就很轻松,也很容易理解了.我之 ... 
- JDK部分源码阅读与理解
		本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK ... 
- JDK源码阅读(一):Object源码分析
		最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ... 
随机推荐
- xml序列化与反序列化工具
			using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ... 
- 科普知识普及 - 桥接VS中继
			首先要说明一个很多人理解的误区,中继比桥接好用,真的是这么回事么? 答案是否定的. 我们在说桥接和中继的时候我们要先了解,桥接和中继的工作原理.还有一个问题,估计很多人都想不明白:为什么中继搜到的信号 ... 
- hdoj:2056
			#include <iostream> #include <iomanip> #include <cstdlib> using namespace std; str ... 
- js学习(六)- js对象创建
			//---------------------js文件--------------------- var namespace02=new Object(); namespace02.Person=fu ... 
- 搭建Airflow数据流调度器
			服务器使用的是centos系统,需要安装好pip和setuptools,同时注意更新安装的版本 接下来参考安装好Airflow Airflow 1.8 工作流平台搭建 http://blog.csdn ... 
- 基于Gradle的spring boot 项目构建
			今天听只是分享,听到不用maven而使用Gradle构建,就尝试了下 Java三大构建工具:Ant.Maven和Gradle Gradle是一个基于Apache Ant和Apache Maven概念的 ... 
- 关于QT Graphics View开启OpenGL渲染后复选框、微调框等无法正常显示的问题
			之前学习QT Graphics View框架,除了基本的图元外,还可以通过QGraphicsProxyWidget类添加QT的基本Widget(如按钮.复选框.单选框等),常使用的场景类接口如下: Q ... 
- SQUAD的rnet复现踩坑记
			在港科大rnet(https://github.com/HKUST-KnowComp/R-Net) 实现的基础上做了复现 采用melt框架训练,原因是港科大实现在工程上不是很完美,包括固定了batch ... 
- ubuntu中安装blogPost
			1.实验环境 Ubuntu16.04x86 2.安装blogPost步骤 2.1 安装方式比较简单,打开ubuntu软件中心 2.2 搜索DB Browser for SQLite,点击安装即可 上图 ... 
- python基础类型—字符串
			字符串str 用引号引起开的就是字符串(单引号,双引号,多引号) 1.字符串的索引与切片. 索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推. a = 'ABCDEFGHIJK' p ... 
