1.定义

  HashSet继承AbstractSet类,实现Set,Cloneable,Serializable接口。Set 接口是一种不包括重复元素的 Collection,它维持它自己的内部排序,所以随机访问没有任何意义。

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

  HashSet的底层是靠HashMap进行存储的,map中的key值中存储着set集合中的元素,不允许重复,而value值则使用PRESENT进行填充。

private transient HashMap<E,Object> map;

// 定义一个Object对象作为HashMap的value值
private static final Object PRESENT = new Object();

  HashSet的构造函数

   //构造一个全新空的set,默认大小是16,默认装载因子是0.75 

  public HashSet() {
map = new HashMap<>();
}

  //构造一个包含指定集合中元素的新集合,使用默认的构造因子0.75,如果集合中的元素太少,就采用默认大小16
  //如果Collection为空,则抛出空指针异常
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

  //构造一个具有指定初始大小和装载因子的HashSet
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
} //构造一个指定初始大小和默认装载因子为0.75的HashSet
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
} //该构造函数为此包私有,仅仅由子类LinkedHashSet使用,构造一个新的空链接哈希集合
  //且指定大小和构造函数
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

 2.主要方法

  因为HashSet是基于HashMap进行实现的,所以HashSet的方法实现比较简单,直接调用Map的函数即可。

  //返回元素迭代器,元素以无特定顺序返回
public Iterator<E> iterator() {
return map.keySet().iterator();
} //返回Set大小
public int size() {
return map.size();
}  //返回Set中是否为空
public boolean isEmpty() {
return map.isEmpty();
} //返回集合中是否包含该元素
public boolean contains(Object o) {
return map.containsKey(o);
} //添加元素到集合中,如果集合不包含该元素,则添加。如果包含,则集合保持不变并且返回。
  //此时map中添加的value值是PRESENT,该对象是static final对象
public boolean add(E e) {
return map.put(e, PRESENT)==null;
} //如果集合包含该元素,则删除元素
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
} //清空Set
public void clear() {
map.clear();
} //Clone函数是浅复制,并没有复制元素本身
@SuppressWarnings("unchecked")
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}

JDK源码之HashSet的更多相关文章

  1. jdk源码->集合->HashSet

    类的属性 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...

  2. 从JDK源码学习HashSet和HashTable

    HashSet Java中的集合(Collection)有三类,一类是List,一类是Queue,再有一类就是Set. 前两个集合内的元素是有序的,元素可以重复:最后一个集合内的元素无序,但元素不可重 ...

  3. jdk源码阅读笔记-HashSet

    通过阅读源码发现,HashSet底层的实现源码其实就是调用HashMap的方法实现的,所以如果你阅读过HashMap或对HashMap比较熟悉的话,那么阅读HashSet就很轻松,也很容易理解了.我之 ...

  4. 【java基础之jdk源码】集合类

    最近在整理JAVA 基础知识,从jdk源码入手,今天就jdk中 java.util包下集合类进行理解 先看图 从类图结构可以了解 java.util包下的2个大类: 1.Collecton:可以理解为 ...

  5. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  6. JDK源码阅读顺序

      很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Obj ...

  7. 一点一点看JDK源码(一)Collection体系概览

    一点一点看JDK源码(一)Collection体系概览 liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 Collection为集 ...

  8. JDK源码阅读(一):Object源码分析

    最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...

  9. 读JDK源码集合部分

    以前读过一遍JDK源码的集合部分,读完了一段时间后忘了,直到有一次面试简历上还写着读过JDK集合部分的源码,但面试官让我说说,感觉记得不是很清楚了,回答的也模模糊糊的,哎,老了记性越来越差了,所以再回 ...

随机推荐

  1. PBFT(拜占庭容错)简述

    共识算法 区块链中最重要的便是共识算法,比特币使用的是POW(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算力变的不怎么重要了,而今PO ...

  2. 《全栈性能Jmeter》-7JMeter常用脚本开发

  3. unity3d-游戏实战突出重围,第四天 添加角色

    1:添加unity自带的第一人称角色控制器,命名为hreo 2:添加第三人称角色控制器.这里是添加源文件Sources下面的.如箭头指示:而不是“3rd Person Controller”.并命名为 ...

  4. eclipse显示xml提示

    当网速比较慢时,可以添加本地的dtd. window下的preferces,输入xml,找到xml catalog 接着

  5. 安装FusionInsight

    1.在华为平台上下载整体客户端,不建议下载单个组件客户端,后期关联测试还是要装上的.   2.下载后需要将服务器上的客户端拷贝到本地.打开xShell,新建会话,登陆本地虚拟机上的Linux系统(19 ...

  6. 网站的title添加图片

    将图片作为ico格式,大小设置为16 * 16px左右,太大显示不完整, 命名需为"favicon.ico", 命名需为"favicon.ico", 命名需为& ...

  7. DateTime.Compare(t1,t2)比较两个日期大小

    DateTime.Compare(t1,t2)比较两个日期大小,排前面的小,排在后面的大,比如:2011-2-1就小于2012-3-2返回值小于零:  t1 小于 t2. 返回值等于零 : t1 等于 ...

  8. Mongodb $in $or 性能比较

      MongoDB docs have the answer: "When using $or with <expressions> that are equality chec ...

  9. protobuf编译.proto文档

    1:在同一目录下按键盘shift+鼠标右键-->点击-->在此处打开命令窗口,打开后如下图所示 2.该目录下有person.proto文档,可以自己编写,如下 syntax = " ...

  10. html5-css的使用强制优先级

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...