此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

6.1、对于HashSet需要掌握以下几点

  • HashSet的创建:HashSet()

  • 往HashSet中添加单个对象:即add(E)方法

  • 删除HashSet中的对象:即remove(Object key)方法

  • 判断对象是否存在于HashSet中:containsKey(Object key)

 注:HashSet没有获取单个对象的方法,需要使用iterator

6.2、构建HashSet

源代码:

    //HashSet底层数据结构:通过hashmap的key不可重复的原则,使得存放入HashSet中的值不重复
    private transient HashMap<E, Object> map;
    //默认的hashmap的value
    private static final Object PRESENT = new Object();
    /**
     * 可存放16个元素
     */
    public HashSet() {
        map = new HashMap<E, Object>();
    }
    /**
     * 指定hashset的容量和负载因子
     */
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<E, Object>(initialCapacity, loadFactor);
    }
    /**
     * 指定hashset的容量
     */
    public HashSet(int initialCapacity) {
        map = new HashMap<E, Object>(initialCapacity);
    }

注:HashSet的底层是HashMap,其依靠HashMap的key不可重复,来保证将来加入到HashSet中的元素也不重复(会将元素作为key放到hashmap中,参照6.3)。

6.3、add(E e)

源代码:

add(E e)

    /**
     * 往set中添加值
     */
    public boolean add(E e) {
        //查看hashmap的put方法,若覆盖已有key的旧值,会返回旧值;若没有相应的key则返回null
        return map.put(e, PRESENT) == null;
    }

注意:这里调用了HashMap的put(K key, V value)

6.4、remove(Object key)

源代码:

    /**
     * 删除指定元素
     */
    public boolean remove(Object o) {
        return map.remove(o) == PRESENT;
    }

注:这里调用了HashMap的remove(Object key)

6.5、contains(Object key)

源代码:

    /**
     * set中是否包含指定元素
     */
    public boolean contains(Object o) {
        return map.containsKey(o);
    }

注意:这里调用了HashMap的containsKey(Object key)

总结:

  • HashSet底层就是HashMap

  • 其依靠HashMap的key不可重复,来保证将来加入到HashSet中的元素也不重复(会将元素作为key放到hashmap中)

  • HashSet线程不安全

HashMap源码解析:

http://www.cnblogs.com/java-zhao/p/5106189.html

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 Gradle task
【推荐】 从DevOps到CloudNative,应用上云姿势全解锁

HashSet源码解析的更多相关文章

  1. 给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&Map迭代器

    今天的主角是HashSet,Set是什么东东,当然也是一种java容器了.      现在再看到Hash心底里有没有会心一笑呢,这里不再赘述hash的概念原理等一大堆东西了(不懂得需要先回去看下Has ...

  2. 第六章 HashSet源码解析

    6.1.对于HashSet需要掌握以下几点 HashSet的创建:HashSet() 往HashSet中添加单个对象:即add(E)方法 删除HashSet中的对象:即remove(Object ke ...

  3. 【Java集合】HashSet源码解析以及HashSet与HashMap的区别

    HashSet 前言 HashSet是一个不可重复且元素无序的集合.内部使用HashMap实现. 我们可以从HashSet源码的类注释中获取到如下信息: 底层基于HashMap实现,所以迭代过程中不能 ...

  4. java集合-HashSet源码解析

    HashSet 无序集合类 实现了Set接口 内部通过HashMap实现 // HashSet public class HashSet<E> extends AbstractSet< ...

  5. Java - HashSet源码解析

    java提高篇(二四)-----HashSet 一.定义 public class HashSet<E> extends AbstractSet<E> implements S ...

  6. HashSet源码解析笔记

    HashSet是基于HashMap实现的.HashSet底层采用HashMap来保存元素,因此HashSet底层其实比较简单. HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素 ...

  7. Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet.内容包括:第1部分 HashSet介绍第2部分 HashSe ...

  8. 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错

    原文网址:http://www.cnblogs.com/skywang12345/p/3311252.html 概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学 ...

  9. Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap

    声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...

随机推荐

  1. centos配置备忘(apache\php\mysql)

    1. 安装apache\php\mysql=======================================yum -y install httpd php mysql mysql-ser ...

  2. Mac版Java安装与配置

    一.下载并安装JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 双击下载的 ...

  3. linux下设置mysql表名不区分大小写

    原文:http://blog.csdn.net/johnsonvily/article/details/6703902 1.Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写: ...

  4. java web实践

    语言:java.javascript 软件:eclipse.mysql 环境配置:下载jdk:配置jdk环境变量.相关教程:https://jingyan.baidu.com/article/db55 ...

  5. Educational Codeforces Round 54 E. Vasya and a Tree(树上差分数组)

    https://codeforces.com/contest/1076/problem/E 题意 给一棵树(n<=3e5),m(3e5)次查询,每次查询u,d,x,表示在u的子树中,给距离u&l ...

  6. RAW转换成RGB

    clc; clear; close all; [filename,pathname]=uigetfile({'*.*','All Files (*.*)'},'Pick a file'); file ...

  7. 【笔记】CSS选择器整理(IE低版本支持性测试)

    时间:2015.05.11 参考附件:css选择器.xmind(网友共享) 查看链接:http://www.w3school.com.cn/cssref/css_selectors.asp   htt ...

  8. 爬虫技巧-西瓜视频MP4地址获取

    记录一下西瓜视频MP4地址的获取步骤 目标: 指定西瓜视频地址,如 https://www.ixigua.com/a6562763969642103303/#mid=6602323830,获取其视频M ...

  9. _编程语言_C++_宏定义#define 和 常量const 的区别

    C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #def ...

  10. centos设置服务开机自动启动的方法

    centos安装好apache,mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了. 例如要开 ...