zoukankan      html  css  js  c++  java
  • Java HashSet源码浅读

       package java.util;
       
       import java.io.InvalidObjectException;
       
       
        public class HashSet<E>
            extends AbstractSet<E>
            implements Set<E>, Cloneable, java.io.Serializable
        {
            static final long serialVersionUID = -5024744406713321676L;
    
        private transient HashMap<E,Object> map;
    
        // 空对象,放在map中的value位置
        private static final Object PRESENT = new Object();
    
        /**
         *构造一个新的,空的HashSet,其底层 HashMap实例的默认初始容量是 16,加载因子是 0.75
         */
        public HashSet() {
            map = new HashMap<>();
        }
    
        /**
         * 构造一个包含指定 collection 中的元素的新 set,容量为传入集合长度除以默认加载因子0.75 与默认初始化容量16的最大值
         */
        public HashSet(Collection<? extends E> c) {
            map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
            addAll(c);
        }
    
        /**
         * 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子
         */
        public HashSet(int initialCapacity, float loadFactor) {
            map = new HashMap<>(initialCapacity, loadFactor);
        }
    
        /**
         *构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子0.75
         */
        public HashSet(int initialCapacity) {
            map = new HashMap<>(initialCapacity);
        }
    
        /**
         * Constructs a new, empty linked hash set.  (This package private
         * constructor is only used by LinkedHashSet.) The backing
         * HashMap instance is a LinkedHashMap with the specified initial
         * capacity and the specified load factor.
         *
         * @param      initialCapacity   the initial capacity of the hash map
         * @param      loadFactor        the load factor of the hash map
         * @param      dummy             ignored (distinguishes this
         *             constructor from other int, float constructor.)
         * @throws     IllegalArgumentException if the initial capacity is less
         *             than zero, or if the load factor is nonpositive
         */
        HashSet(int initialCapacity, float loadFactor, boolean dummy) {
            map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }
    
        /**
         * 返回对此 set 中元素进行迭代的迭代器
         */
        public Iterator<E> iterator() {
            return map.keySet().iterator();
        }
    
        /**
         * 获取数组个数,实际上是获取底层map中数据的个数
         */
        public int size() {
            return map.size();
        }
    
        /**
         * 判断是否为空,实际上是判断map中的size是否等于0
         */
        public boolean isEmpty() {
            return map.isEmpty();
        }
    
        /**
         * 是都包含某元素,实际上是判断是否包含key,因为set只有单值,所map中其实只用到了key,map为空对象
         */
        public boolean contains(Object o) {
            return map.containsKey(o);
        }
    
        /**
         *调用map的put方法,其中value值为静态的Object对象
         */
        public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }
    
        /**
         * 删除元素调用的是map的remove函数
         */
        public boolean remove(Object o) {
            return map.remove(o)==PRESENT;
        }
    
        /**
         * 清空集合,调用的是map的clear()
         */
        public void clear() {
            map.clear();
        }
    
        /**
         * 返回此 HashSet 实例的浅表副本
         */
        @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);
            }
        }
    
    }
    

      

    原文:https://blog.csdn.net/lxx19941220/article/details/89331794

  • 相关阅读:
    Python 面向对象编程
    snmp获取交换机端口和对应ip
    python IPy
    Django F()与Q()函数
    装饰器使用
    log日志信息查看
    shell简单入门
    gunicorn开启、关闭和重启
    CF1453B
    ACWing845 八数码(BFS,全排列hash)
  • 原文地址:https://www.cnblogs.com/qbdj/p/10863240.html
Copyright © 2011-2022 走看看