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

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

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. json数据映射填充到html元素显示

    映射算法做了改进,支持name重复映射 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...

  2. NOIP2016原题终结测试(2017081801)

    NOIP2016还有几道原题没有写掉,今天就一并布置掉. 答案的问题,有部分会先放到NOIP题解中,是单独发布的. 最后会汇总放在答案中,各位不要急. 还有,后期会有原创题测试,这个不急,反正11月才 ...

  3. python学习 day15 (3月20日)----time

    # '2019-03-20 10:40:00'#这个时间向后推一个月 f1 = time.strptime('2019-03-20 10:40','%Y-%m-%d %H:%M') # 把字符串时间转 ...

  4. clion配置c/c++环境

    打开这个界面  点击添加Cygwin选择下载的Cygwin在进行下面的配置 去网站https://www.cygwin.com/选择路径即可(这里只写了配置过程中的关键步骤并且附上IDE的链接直接安装 ...

  5. 使用注解配置 AOP

    一.使用注解(基于Aspect) 1.spring不会自动去寻找注解,必须告诉spring那个包下的类有注解 1.1 先引入xmlns:context命名空间 <context:componen ...

  6. RabbitMQ c#版实现(转)

    出处:https://www.cnblogs.com/hanfan/p/9842301.html 网上很多人已经总结的很好了,比如今天看到的这个.https://www.cnblogs.com/Lip ...

  7. ES6通过使用babel兼容到ie9

    1.打开这个地址: https://unpkg.com/babel-standalone@6/babel.min.js 新建babel.min.js,把代码复制进去,然后在jq项目里引用. 2.在下面 ...

  8. SVD(6.5.1定理证明观察3)

  9. fastjson 错误解决方案详情 com.alibaba.fastjson.JSONException: syntax error, expect {, actual EOF, pos 1410

    原因: 前端传递的数组过于复杂,倒是出现这种问题,前端采用vue axios,发送请求,后端java接收代码,实现前后端分离 后端就收fastjson接收json,进行业务处理,后端Controlle ...

  10. info AI drive

    Who we look for Here at comma, we don't care about the source of your education or your traditional ...