zoukankan      html  css  js  c++  java
  • HashSet源码解析

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

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


    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


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

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


    相关文章:
    【推荐】 GitLab自动触发Jenkins构建
    【推荐】 Question | 你所遇到的验证码问题可能都在这里了

  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/zyfd/p/10150539.html
Copyright © 2011-2022 走看看