zoukankan      html  css  js  c++  java
  • Set集合系列HashSet

    Set集合系列HashSet

    HashSet是Set集合的哈希实现,其继承了AbstractSet抽象类,并实现了Set接口。

      public class HashSet<E>
       extends AbstractSet<E>
       implements Set<E>, Cloneable, java.io.Serializable

    原理

    为了深入理解HashSet的原理,将从成员变量,构造方法,核心方法逐一介绍。

    类成员变量

      
    //HashSet内部使用HashMap存储
    private transient HashMap<E,Object> map;
    //存储在value上的值
    private static final Object PRESENT = new Object();

    从类成员变量我们可以知道,HashSet内部使用HashMap存储,而PRESENT则是存储在所有key上的value。因此对于HashSet来说,其所有key的value都相同。

    构造方法

    HashSet一共有5个构造方法。

      
    public HashSet() {
       map = new HashMap<>();
    }
    public HashSet(Collection<? extends E> c) {
           map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
           addAll(c);
    }
    public HashSet(int initialCapacity, float loadFactor) {
           map = new HashMap<>(initialCapacity, loadFactor);
    }
    public HashSet(int initialCapacity) {
           map = new HashMap<>(initialCapacity);
    }
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
           map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

    可以看到构造方法传入的参数其实就是用于初始化HashMap对象,主要有:initialCapacity(初始化大小),loadFactor(扩容因子)。

    这里有一个关键的细节,即第五个方法使用LinkedHashMap实现,而不是用HashMap实现的。

    核心方法

    对于HashSet来说,其核心方法有add,remove。

    来看add方法:

      
    public boolean add(E e) {
       return map.put(e, PRESENT)==null;
    }

    可以看到add方法直接调用了HashMap对象的put方法。如果Set集合插入成功,那么就返回true,否则返回false。

    更多面试资料,JDK文档,阿里巴巴Java开发手册,pdf书籍,视频,公号《Java路》

     

  • 相关阅读:
    程序的循环结构
    异常处理
    java中多态的使用
    java中String类型的相关知识
    java中类与对象
    java中部分知识点的验证实现
    java 中递归的实现 以及利用递归方法实现汉诺塔
    java 枚举类型和数据二进制等问题思考
    简单的java程序通过对话框输出 计算加减乘除运算(运算方法可选择)
    大道至简第二章读后感
  • 原文地址:https://www.cnblogs.com/JavaUsername/p/13841186.html
Copyright © 2011-2022 走看看