• HashSet源码分析


    简介

    基于HashMap的Set接口实现。它不保证集合的迭代顺序。特别是,它不能保证顺序会随着时间的推移保持恒定,当扩容时顺序将调整。此类允许null元素。

    类继承关系

    在这里插入图片描述

    属性

    	-- 创建的HashMap
        private transient HashMap<E,Object> map;
    	-- 因为底层使用HashMap实现,要存key,value,这个固定值就是所有数据的value了
        private static final Object PRESENT = new Object();
    

    构造方法

    -- 这里构造方法是创建了一个HashMap
    public HashSet() {
       map = new HashMap<>();
    }
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
    -- 给LinkedHashSet使用
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
    

    方法

    -- 添加 调用map的put方法
    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();
    }
    public boolean isEmpty() {
        return map.isEmpty();
    }
    public int size() {
        return map.size();
    }
    -- hashset没有提供get方法
    public boolean contains(Object o) {
        return map.containsKey(o);
    }
    -- 调用map的keyset迭代 更像是hashmap留下的钩子
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
    -- 重写克隆方法 实现深拷贝
    public Object clone() {
        try {
            HashSet<E> newSet = (HashSet<E>) super.clone();
            newSet.map = (HashMap<E, Object>) map.clone();
            return newSet;
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }
    }
    

    总结

    内部使用HashMap的key存储元素,来保证数据不重复
    线程不安全
    无序
    允许key为null
    没有get方法
    支持快速失败

  • 相关阅读:
    序列化与反序列化之Kryo
    集合框架
    dubbo配置方式简单介绍
    sql(Oracle)优化之索引
    多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
    Storm 性能优化
    web.xml配置重理解
    Java各个版本的新特性
    这两天光写shell了,再贴一段代码,以供日后参考。
    Hadoop常用操作笔记
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284619.html
Copyright © 2020-2023  润新知