HashSet内部原理解析Header源码解析Footer

Header

HashSet是用来存储没有重复元素的集合类,并且它是无序的。

HashSet 内部实现是基于 HashMap ,实现了 Set 接口。

源码解析

构造方法

    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);
    }

我们发现,除了最后一个 HashSet 的构造方法外,其他所有内部就是去创建一个 Hashap 。没有其他的操作。而最后一个构造方法不是 public 的,所以不对外公开。

add

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

add 方法很简单,就是在 map 中放入一键值对。 key 就是要存入的元素,value 是 PRESENT ,其实就是 new Object() 。所以,HashSet 是不能重复的。

remove

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

相应的,remove 就是从 map 中移除 key 。

contains

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

这些代码应该很明白,不需要讲了。

iterator

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

内部调用的就是 HashMap 中 keySet 的 iterator 方法。

size

    public int size() {
        return map.size();
    }

剩下的 HashSet 方法也不多,内部也都是通过 HashMap 实现的。就不贴出来了,大家回去看一下都会明白的。

Footer

从上看下来,HashSet 的源码是挺简单的,内部都是用 HashMap 来实现的。利用了 HashMap 的 key 不能重复这个原理来实现 HashSet 。

内容很简短,都讲完了,再见。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hongten

ArrayList, LinkedList, Vector - dudu:史上最详解

ArrayList, LinkedList, Vector - dudu:史上最详解

933
来自专栏用户2442861的专栏

【Java集合源码剖析】ArrayList源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35568011

803
来自专栏LanceToBigData

Java集合源码分析(一)ArrayList

前言   在前面的学习集合中只是介绍了集合的相关用法,我们想要更深入的去了解集合那就要通过我们去分析它的源码来了解它。希望对集合有一个更进一步的理解!   既然...

2586
来自专栏前端说吧

JS - 二叉树算法实现与遍历 (更新中...)

3958
来自专栏Java 源码分析

ArrayList 源码分析

ArrayList 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所...

3434
来自专栏用户画像

6.3.2 B+树基本概念

2)非叶根(不是叶子的根结点)结点至少有两棵子树,其他每个分支结点至少有【m/2】(向下取整)棵子树。(B树是要求至少2棵子树)

972
来自专栏武培轩的专栏

Hashtable源码解析(JDK1.8)

1 package java.util; 2 3 import java.io.*; 4 import java.util.concu...

3054
来自专栏微信公众号:Java团长

Java集合源码剖析——ArrayList源码剖析

ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。

1092
来自专栏用户画像

6.3.1 B树及其基本操作

B树,又称多路平衡查找树,B树中所有节点的孩子结点数的最大值成为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树:

911
来自专栏java技术学习之道

Java进阶--深入理解ArrayList实现原理

1203

扫码关注云+社区

领取腾讯云代金券