Java集合:HashSet底层原理

HashSet是最常用的Set集合之一,可以保证元素的唯一性。

  1. 底层原理
    底层就是HashMap,存储的元素为HashMap的key,HashMap的value默认存储了一个Object的静态常量PRESENT
  2. 构造方法
    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);
    }
    
  3. add/remove/contains等方法
    也都调用的HashMap的相应方法
    public Iterator<E> iterator() {  // 迭代,其实为HashMap的key的迭代
        return map.keySet().iterator();
    }
    
    public boolean contains(Object o) {
        return map.containsKey(o);
    }
    
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }
    
    public void clear() {
        map.clear();
    }
    
  4. 保证唯一性
    HashSet调用HashMap的put方法,而put方法中有一行逻辑,哈希值与key都相同,会直接用新值覆盖旧值。HashSet利用这一特性来保证唯一性。
    所以,存放对象时需要重写hashCode与equals方法,否则就会出现,两个对象的key值(各种属性值)相同,但由于哈希值不同,而出现重复存储。

参考:
https://segmentfault.com/a/1190000021434077
Java源码

posted @   aguo718  阅读(387)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示