HashSet(源码解读)

简介: HashSet(源码解读)

HashSet概述

HashSet的代码行数 300多行,是我见过最少代码的集合了,非常简单,它有以下的特点

  • 没有重复元素的集合。底层基于HashMap来实现。
  • 非线程安全,创建线程安全的HashMap可以使用Collections.synchronizedSet。

HashSet源码解读

继承关系

  • 继承AbstractSet抽象类,实现Set接口
  • 实现java.io.Serialization接口,支持序列化
  • 实现Cloneable接口,支持对象克隆,浅复制

属性

     //使用HashMap来保存HashSet的元素
    private transient HashMap<E,Object> map;

    //HashSet只使用到key,因此使用一个静态常量来充当HashSet的value值
    private static final Object PRESENT = new Object();
复制代码

构造方法

  //使用默认容量大小16以及加载因子0.75初始化HashMap,构造HashSet
    public HashSet() {
        map = new HashMap<>();
    }

    //初始化指定集合和默认加载因子0.75的map,构造HashSet
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    //使用指定容量大小和加载因子初始化map,构造HashSet
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    //使用指定容量大小和默认加载因子0.75初始化map,构造HashSet
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    //包访问权限,构造空的LinkedHashSet
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
复制代码

方法

  • size()方法:内部调用Map的size方法。
    public int size() {
        return map.size();
    }
复制代码
  • isEmpty()方法,也是调用map,里面是通过判断size是否为0来判断是否为null
 public boolean isEmpty() {
        return map.isEmpty();
    }
复制代码
  • add()方法 HashSet的add方法内部通过HashMap.put()方法来实现key的添加,在HashMap内部真正执行的是putVal()方法,putVal这边就不说了 HashMap讲过
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
复制代码

总结

HashSet 还真没啥讲了 ,就是把HashMap的key 拿来当数据存,基本上都是调用的是HashMap的方法,所以说讲的也少,总结一下吧

  • HashSet的实现支持null的key,同时HashSet的内部不支持重复的key
  • 不重复
  • 线程不安全


目录
相关文章
|
9月前
|
存储 Java
每日一道面试题之HashSet的实现原理~
每日一道面试题之HashSet的实现原理~
|
2月前
HashSet 源码解读
HashSet 源码解读
18 1
|
2月前
ArrayList源码解读
ArrayList源码解读
10 1
|
11月前
|
存储 算法 Java
HashSet源码剖析
HashSet源码剖析
38 0
|
存储 算法 Java
【Java集合框架 二】HashMap源码分析
【Java集合框架 二】HashMap源码分析
74 0
|
存储 算法
面试题:说一下HashMap和HashSet的实现原理?
面试题:说一下HashMap和HashSet的实现原理?
78 0
Java集合源码剖析——基于JDK1.8中HashSet、LinkedHashSet的实现原理
Java集合源码剖析——基于JDK1.8中HashSet、LinkedHashSet的实现原理
Java集合源码剖析——基于JDK1.8中HashSet、LinkedHashSet的实现原理
|
存储 安全 Java
java集合系列(3)ArrayList(源码分析)
这篇文章开始介绍ArrayList。ArrayList基本上是我们在平时的开发当中,使用最多的一个集合类了,它是一个其容量能够动态增长的动态数组。所以这篇文章,旨在从源码的角度进行分析和理解。为了使得文章更加有条理,还是先给出这篇文章的大致脉络: 首先,ArrayList的基本介绍和源码API(只给出方法分析,重要的方法给出详细代码)。 然后,介绍遍历ArrayList的几种方式 接下来,叙述一下ArrayList与其他集合关键字的区别和优缺点 最后,进行一个总结
224 0
java集合系列(3)ArrayList(源码分析)
|
存储 Java
HashSet的底层原理
HashSet的底层原理
107 0
|
存储 Java
HashMap源码解读
带你走进HashMap,了解HashMap的特性和HashMap源码解读(jdk7)。
147 0
HashMap源码解读

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19