HashSet 源码分析

HashSet

1)HashSet 是基于 HashMap 的 Set 接口实现,元素的迭代是无序的,可以使用 null 元素。

创建实例

    /**
     * HashSet基于HashMap实现
     */
    private transient HashMap<E,Object> map;

    // 用于在支持的 HashMap 中关联键的傀儡对象
    private static final Object PRESENT = new Object();

    /**
     *  创建一个初始容量为 16,加载因子为 0.75 的 HashMap 支持的 HashSet
     */
    public HashSet() {
        map = new HashMap<>();
    }

    /**
     *  创建一个初始容量为 initialCapacity,加载因子为 loadFactor 的 HashMap 支持的 HashSet
     */
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    /**
     *  创建一个初始容量为 initialCapacity,加载因子为 0.75 的 HashMap 支持的 HashSet
     */
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    /**
     *  创建一个初始容量为 initialCapacity,
     *  加载因子为 loadFactor 的 LinkedHashMap 支持的 HashSet,
     *  主要被 LinkedHashSet 使用。
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

其他方法

    /**
     *  获取 HashSet 中所有元素的乱序迭代器
     */
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

    /**
     *  获取 HashSet 中元素的总数
     */
    public int size() {
        return map.size();
    }

    /**
     *  HashSet 是否为空
     */
    public boolean isEmpty() {
        return map.isEmpty();
    }

    /**
     *  判断此 HashSet 中是否包含指定的值
     */
    public boolean contains(Object o) {
        return map.containsKey(o);
    }

    /**
     *  如果元素不存在,则新增【返回值为 null】,返回值为 true;
     *  否则不对 HashSet 做修改,返回值为 false【PRESENT == null】。
     */
    public boolean add(E e) {
        return map.put(e, HashSet.PRESENT)==null;
    }

    /**
     *  从 HashSet 中移除指定的元素
     */
    public boolean remove(Object o) {
        return map.remove(o)==HashSet.PRESENT;
    }

    /**
     *  清空 HashSet
     */
    public void clear() {
        map.clear();
    }

原文地址:https://www.cnblogs.com/zhuxudong/p/10041561.html

时间: 2024-10-23 12:51:21

HashSet 源码分析的相关文章

Java集合系列之HashSet源码分析

一.HashSet简介 HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素,具有很好的存取和查找性能.主要具有以下特点: 不保证set的迭代顺序 HashSet不是同步的,如果多个线程同时访问一个HashSet,要通过代码来保证其同步 集合元素值可以是null 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该值确定对象在HashSet中的存储位置.在Hash集合中,不能同时存放两个相等的

死磕 java集合之HashSet源码分析

问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5)HashSet是同步的吗? (6)什么是fail-fast? 简介 集合,这个概念有点模糊. 广义上来讲,java中的集合是指java.util包下面的容器类,包括和Collection及Map相关的所有类. 中义上来讲,我们一般说集合特指java集合中的Collection相关的类,不包含Map相

HashSet源码分析

由哈希表实现,实际底层为HashMap. public HashSet(Collection<? extends E> c) { map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initi

java.util.HashSet源码分析

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable HashSet实现Set接口,内部维护一个HashMap实例变量.不保证顺序,允许null元素. 对于基本的操作,如add,remove,contains,size,只需要常量的时间复杂度. 不是线程安全的,如果在多线程环境下,需要被同步化,如调用方法Collections.s

HashSet源码分析 jdk1.6

Set的特点:Set元素无顺序,且元素不可以重复. 1.定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable Set接口定义: public interface Set<E> extends Collection<E> { // Query Operations int size(); boolean

Java8集合框架——HashSet源码分析

本文的目录结构: 一.HashSet 的 Javadoc 文档注释和简要说明 二.HashSet 的内部实现:内部属性和构造函数 三.HashSet 的 add 操作和扩容 四.HashSet 的 remove 操作 一.HashSet 的 Javadoc 文档注释和简要说明 截个图,然后来观摩 HashSet 的javadoc,照样是几点总结摘抄: Set 接口的实现类,内部使用了一个 HashMap 实例:不保证 set 的迭代顺序(无序):允许存储 null 通常情况下(假如 hash 分

集合之HashSet(含JDK1.8源码分析)

一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和LinkedHashSet,其实在分析完了HashMap.LinkedHashMap之后,再来看HashSet和LinkedHashSet就会非常简单. 二.hashSet的数据结构 因为hashSet的底层是基于hashMap或linkedHashMap的(new hashSet的时候可以指定),

知识链-源码分析

源码分析 HashSet源码分析 HashMap源码分析 源码解析Servlet和HttpServlet

死磕 java集合之PriorityQueue源码分析

问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素. 一般来说,优先级队列使用堆来实现. 还记得堆的相关知识吗?链接直达[拜托,面试别再问我堆(排序)了!]. 那么Java里面是如何通过"堆"这个数据结构来实现优先级队列的呢? 让我们一起来学习吧. 源码分析 主要属性