【java源码】HashSet、HashMap详解

HashSet底层是HashMap,故本文主要围绕HashMap展开

HashSet 简述(不同之处)

核心成员变量

  1. private transient HashMap<E,Object> map,依托HashMap实现功能。使用transient对数据反序列化的理由同ArrayList中的elementData
    1. 由于扩容机制的存在(尤其是达到阈值就扩容),数组(map底层仍然是Node型数组)内存在不少空元素是常见的情形。因此为了节省空间、提高性能,HashSet也重写了序列化相关的writeObject()readObject()方法,手动序列化和反序列化存入元素。
  2. private static final Object PRESENT = new Object();map需要以键值对形式存入,故PRESENT 作为所有键的共同对应值,即起占位作用。

构造器

HashSet(Collection<? extends E> c),容量在集合大小的4/3倍和16之间取大值。addAll方法是继承父类AbstractCollection的同名方法,通过调用add()方法将集合中的元素逐个加入。


这里笔者认为存在bug,后续扩容机制中细说
这里由于HashMap的相应构造器中调用了tableSizeFor方法,故最终容量大小仍然是2的幂。具体见后文。


public HashSet(Collection<? extends E> c) {
   
   
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

HashSet()HashSet(int initialCapacity)HashSet(int initialCapacity, float loadFactor)底层为HashMap,故略

成员方法

HashMap

entrySetkeySetvalues方法及它们用到的内部类EntrySetKeySetValues,由于篇幅已单独成文。

https://blog.csdn.net/weixin_50934030/article/details/135348058

核心成员变量

  1. transient Node<K,V>[] table,用于存储键值对
  2. transient Set<Map.Entry<K,V>> entrySet,实际运行类为HashMap.EntrySet,为entrySet方法服务
  3. transient Set<K> keySet ,实际运行类为HashMap.KeySet,为keySet方法服务
  4. transient Collection<V> values,实际运行类为HashMap.Values,为values方法服务
static class Node<K,V> implements Map.Entry<K,V> {
   
   
    final int hash;
    final K key;
    V value;
    Node<K,V> next;

    Node(int hash, K key, V value, Node<K,V> next) {
   
   
        this.hash = hash;
        this.key = key;
        this.value = value;
        this.next = next;
    }
    public final K getKey()        {
   
    return key; }
    public final V getValue()      {
   
    return value; }
    public final String toString() {
   
    return key + "=" + value; }
	//重写了hashCode方法
    public final int hashCode() {
   
   
        return Objects.hashCode(key) ^ Objects.hashCode(value);
    }

    public final V setValue(V newValue) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值