类的属性

public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
// 版本序列号
static final long serialVersionUID = -5024744406713321676L;
// 内部持有的hashmap引用
private transient HashMap<E,Object> map;
// 用作hashmap所有键对应的值,为什么不设置成null呢?
private static final Object PRESENT = new Object();
}

构造函数

HashSet()

    public HashSet() {
// 实例化一个hashmap对象,并将内部的一个map引用指向它
map = new HashMap<>();
}

HashSet()

    public HashSet(Collection<? extends E> c) {
// 相当于HashMap(Colletion<? extends E>c)
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

其他构造函数与HashMap基本相同,不再累述

常用方法

contains(Object o)

    public boolean contains(Object o) {
// 本质是调用hashmap的containsKey方法
return map.containsKey(o);
}

add(E e)

    public boolean add(E e) {
// 本质是调用hashmap的put方法,对于hashmap的put方法返回值:如果put进去的key在hashmap中已经存在会返回oldValue(对HashSet来说就是PRESENT),如果put进去的key不存在就会返回null,这可以解释两个问题:1.为什么PRESENT不设计成null;2.为什么HashSet中的元素不可重复
return map.put(e, PRESENT)==null;
}

remove(Object o)

    public boolean remove(Object o) {
// 本质是调用hashmap的remove方法,对于hashmap的remove方法的返回值:如果对应的key存在,删除key-value键值对之后返回value,如果不存在返回null
return map.remove(o)==PRESENT;
}

jdk源码->集合->HashSet的更多相关文章

  1. 读JDK源码集合部分

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

  2. jdk源码->集合->HashMap

    一.hash算法 1.1 hash简介 hash,一般翻译为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出值就是散列值,这种转换是一种压缩映射,也就是散列的空间小于输入的空间, ...

  3. jdk源码->集合->ArrayList

    类的属性 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomA ...

  4. JDK源码之HashSet

    1.定义 HashSet继承AbstractSet类,实现Set,Cloneable,Serializable接口.Set 接口是一种不包括重复元素的 Collection,它维持它自己的内部排序,所 ...

  5. 从JDK源码学习HashSet和HashTable

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

  6. jdk源码->集合->ConcurrentHashMap

    类的属性 public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentM ...

  7. jdk源码->集合->LinkedList

    类的属性 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E&g ...

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

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

  9. jdk源码阅读笔记-HashSet

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

随机推荐

  1. Chris Richardson微服务翻译:微服务介绍

    作者简介:Chris Richardson,世界著名的软件架构师,经典著作<POJOS IN ACTION>的作者,cloudfoundry.com 的创始人 微服务目前正受到大量的关注, ...

  2. js中的伪数组

    一, 伪数组 1. 具有length属性 2. 按索引方式存储数据 3. 不具有数组的方法, 比如push(),pop()等 二, 生成伪数组的方法 在js中生成伪数组的方法比较多 1. functi ...

  3. request拿各种东西

    例如 : http://localhost:8080/projectName/aaa/bbb?name=zhangsan获取项目名(目录) /projectNameString uri = reque ...

  4. Maven02——回顾、整合ssh框架、分模块开发、私服

    1 回顾 1.1 Maven的好处 节省空间 对jar包做了统一管理 依赖管理 一键构建 可跨平台 应用在大型项目可提高开发效率 1.2 Maven安装部署配置 1.3 Maven的仓库 本地仓库 远 ...

  5. Linux各种版本

     1.1   Fedora Core和Fedora 一开始总搞不清楚 Fedora Core和Fedora有什么关系?有什么不同,现在终于明白了,自从Fedora Core 第七版开始以后就开始称作F ...

  6. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

    "/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...

  7. 图书管理系统设置登录验证(cookies)

    先前做的图书管理登录页面虽然有那个页面,在你登录之后他会在数据库中查找值,然后验证,最后跳转到指定页面,,可是当你直接访问那个指定页面的时候不用登录也可以登录那个指定的页面: 由于前段时间已经做过图书 ...

  8. cs231n spring 2017 lecture11 Detection and Segmentation 听课笔记

    1. Semantic Segmentation 把每个像素分类到某个语义. 为了减少运算量,会先降采样再升采样.降采样一般用池化层,升采样有各种"Unpooling"." ...

  9. deeplearning.ai 改善深层神经网络 week2 优化算法 听课笔记

    这一周的主题是优化算法. 1.  Mini-batch: 上一门课讨论的向量化的目的是去掉for循环加速优化计算,X = [x(1) x(2) x(3) ... x(m)],X的每一个列向量x(i)是 ...

  10. [OpenCV][ARM9下移植OpenCV]

    [OpenCV][ARM9下移植OpenCV]   安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3. ...