Java容器之HashSet

一. HashSet的类关系图

Java容器之HashSet_第1张图片

二. HashSet简介

  • HashSet是Set接口的典型实现, 大多数时候使用Set集合时就是使用这个实现类.HashSet按 Hash算法(实际上HsahSet没有自己实现存储,而是调用的HashMap的实现) 来存储集合中的元素.
  • HashSet无序 HashSet不能保证元素的排列顺序,顺序可能与添加的顺序不同,顺序也有可能发生变化.
  • 线程不安全 HashSet不是线程同步的,如果多个线程同时修改一个HashSet,则必须通过代码来保证其同步.
  • HashSet长度可变 HashSet通过计算存储对象的Hash码来保存数据,保存在HashSet中的数据元素在内存中的位置是不连续的,HashSet的长度也是不固定的.
  • 元素不可重复 HashSet容器中不允许包含相同的元素.后面我们会一起看下如何判断是否是相同元素的.
  • 特点 什么是特点? 和别人不一样的就是特点被,我认为HashSet最大的特点就是不能保存重复数据,提到去重复,我第一个想到的就是Set.
  • 底层实现 HashMap

三. 源码与底层实现

  • 为什么说HashSet的底层实现是HashMap? 我们还是先打个断点看下结构
    Java容器之HashSet_第2张图片
    在这个结构中我们可以看到,HashSet将"香蕉"这个值存储在了map中的keySet中
  • 然后在看下源码中的add()方法
    Java容器之HashSet_第3张图片
    这里我们可以看到,add()方法和remove()方法实际上都是对map属性进行操作的
  • 我们可以接着看一下构造方法
    Java容器之HashSet_第4张图片
    在这里我们可以看到其中的三个构造都是new了一个HashMap赋值给了map属性,实际上除了HashSet(int initialCapacity, float loadFactor, boolean dummy)这个构造是创建的LinkedHashMap<>,其余四个都是HashMap. 而LinkedHashMap是HashMap的子类.
  • 我们可以在看下map在HashSet中的声明
    Java容器之HashSet_第5张图片
    这个map声明的时候就是一个HashMap类型, key值是一个泛型,而value值是一个object
  • 结论
    HashSet的底层实现就是HashMap,HashSet中的值就保存在HashMap的key中.

你可能感兴趣的:(面试,容器)