HashMap如何做到通过EntrySet来查询?EntrySet什么时候放入数据了?

HashMap通过EntrySet查询涉及到数据存储的原理。HashMap的内部类EntrySet继承自AbstractSet,作为桥梁连接集合与图。数据存储在Node数组table[]中,通过key的hash值确定存储位置。查询时,若知道key则直接计算位置查找,否则遍历链表。当需要遍历,HashMap提供entrySet、keySet和values方法,返回集合视图,但实际仍是对table[]的遍历,避免了额外的空间开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 继承关系

在这里插入图片描述

  • Map是图,HashMap是其实现子类
  • Collection是集合,Set是其实现接口,也是一种集合,AbstractSet是Set接口的抽象实现类
  • EntrySet作为HashMap的内部类,又作为AbstractSet的直接实现类,架通了一条集合与图之间的桥梁;
2. 数据到底存在哪里?
  • 当我们创建HashMap实例,并往里面put元素的时候,数据的存储如下:
    在这里插入图片描述

  • HashMap类确实维护了一个字段table,从图中看出其类型是HashMap$Node[ ]

 transient Node<K,V>[] table;
  • Node是HashMap内部的一个节点类,用于存放Map的<K, V>数据:
    static class Node<K,V> implements Map.Entry<K,V> {
   
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
  • table[ ]是一个数组,此处可称为表头,HashMap的hash一词就体现在这个表头的存储方式上:
public V put(K key, V value) {
   
        return putVal(hash(key), key, value, false, true);
    }
final V putVal
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值