首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中HashMap原理及其使用场景,提供一个自定义HashMap实际案例

Java中HashMap原理及其使用场景,提供一个自定义HashMap实际案例

作者头像
用户1289394
发布于 2024-05-29 07:17:41
发布于 2024-05-29 07:17:41
27000
代码可运行
举报
文章被收录于专栏:Java学习网Java学习网
运行总次数:0
代码可运行

Java中的HashMap是一种基于哈希表的数据结构,用于存储键值对。它实现了Map接口,允许我们通过键来快速查找对应的值,具有高效的插入、删除和查找操作。HashMap内部使用数组和链表(或红黑树)组合的方式来实现,它的核心思想是通过哈希算法将键映射到数组索引上,从而实现快速的查找。

HashMap的原理:

存储结构:HashMap内部维护一个Entry数组,每个Entry包含键、值和指向下一个Entry的指针(链表或红黑树节点)。

哈希计算:当我们插入一个键值对时,首先会对键进行哈希计算,得到一个哈希码。HashMap使用哈希码和数组长度取模的方式来确定该Entry在数组中的位置。

处理哈希冲突:由于不同的键可能映射到相同的数组索引上,这就是哈希冲突。HashMap内部使用链表或红黑树来解决哈希冲突问题,当链表长度超过一定阈值时,链表会转换为红黑树,提高查找效率。

扩容:当HashMap中的元素数量达到负载因子(load factor)与容量的乘积时,HashMap会自动扩容,重新计算每个元素的位置,以保证哈希表的性能。

HashMap的使用场景:

高效查找:HashMap适用于需要快速查找特定键对应值的场景,时间复杂度为O(1)。

键值存储:HashMap适合存储键值对数据,比如缓存数据、配置信息等。

数据唯一性:HashMap中的键是唯一的,可以用于去重或判断某个键是否存在。

接下来,我将演示一个简单的自定义HashMap的实际案例。在这个案例中,我将展示如何自己实现一个简单的HashMap,并模拟put和get方法来存储和获取键值对。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.LinkedList;

public class CustomHashMap<K, V> {
    private static final int DEFAULT_CAPACITY = 16;
    private LinkedList<Entry<K, V>>[] buckets;

    public CustomHashMap() {
        buckets = new LinkedList[DEFAULT_CAPACITY];
        for (int i = 0; i < DEFAULT_CAPACITY; i++) {
            buckets[i] = new LinkedList<>();
        }
    }

    private int getBucketIndex(K key) {
        return key.hashCode() % DEFAULT_CAPACITY;
    }

    public void put(K key, V value) {
        int index = getBucketIndex(key);
        LinkedList<Entry<K, V>> bucket = buckets[index];
        for (Entry<K, V> entry : bucket) {
            if (entry.getKey().equals(key)) {
                entry.setValue(value);
                return;
            }
        }
        bucket.add(new Entry<>(key, value));
    }

    public V get(K key) {
        int index = getBucketIndex(key);
        LinkedList<Entry<K, V>> bucket = buckets[index];
        for (Entry<K, V> entry : bucket) {
            if (entry.getKey().equals(key)) {
                return entry.getValue();
            }
        }
        return null;
    }

    private static class Entry<K, V> {
        private K key;
        private V value;

        public Entry(K key, V value) {
            this.key = key;
            this.value = value;
        }

        public K getKey() {
            return key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }

    public static void main(String[] args) {
        CustomHashMap<String, Integer> map = new CustomHashMap<>();
        map.put("one", 1);
        map.put("two", 2);
        map.put("three", 3);

        System.out.println("Value for key 'one': " + map.get("one"));
        System.out.println("Value for key 'two': " + map.get("two"));
        System.out.println("Value for key 'three': " + map.get("three"));

        // Output:
        // Value for key 'one': 1
        // Value for key 'two': 2
        // Value for key 'three': 3
    }
}

在上述代码中,我们实现了一个简单的CustomHashMap类,其中包含put和get方法用于存储和获取键值对。我们通过哈希算法确定键值对在数组中的位置,并使用链表来处理哈希冲突。通过这个案例,我们可以更好地理解HashMap的原理和使用方法,并自己动手实现一个简单的HashMap数据结构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
了解HashMap
HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。
橘子君丶
2023/03/08
4990
了解HashMap
HashMap(JDK1.8)源码+底层数据结构分析
HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。
黑洞代码
2021/02/09
3030
【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
HashMap的数据结构采用“链表散列”结构,即一个链表和一个数组,数组称为hash table,链表成为链表数组。HashMap通过key的hashCode来计算index,然后将key-value对存放在hash table的对应位置。如果出现hash冲突,就将数据存放在链表中。HashMap主要由Node[] table、size和loadFactor三个字段组成。
青山师
2023/05/05
3130
Java HashMap:设计思想与实现原理详解
HashMap是Java中常用的数据结构之一,提供了一种键值对存储和检索的机制。在本文中,我们将深入探讨HashMap的设计思想和实现原理,并通过具体案例和源代码逐步解析不同版本中的改进。
GeekLiHua
2025/01/21
2860
面试中最长常问到的 HashMap,你都知道多少?
推荐阅读:https://zhuanlan.zhihu.com/p/31610616
村雨遥
2020/08/13
4110
手写HashMap,快手面试官直呼内行!
这……我当时就麻了,我们都知道HashMap的数据结构是数组+链表+红黑树,这是要手撕红黑树的节奏吗?
三分恶
2021/11/29
5320
手写HashMap,快手面试官直呼内行!
为什么jdk1.8之前HashMap是由List+链表组成?
链表是由一系列节点组成的数据结构,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的特点是插入和删除操作比较高效,但是查找操作需要遍历整个链表。
贺公子之数据科学与艺术
2025/08/29
1610
BAT面试必问HashMap源码分析
HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。
美的让人心动
2019/05/21
3550
BAT面试必问HashMap源码分析
Java HashMap详解及实现原理
Java HashMap是Java集合框架中最常用的实现Map接口的数据结构,它使用哈希表实现,允许null作为键和值,可以存储不同类型的键值对。HashMap提供了高效的存取方法,并且是非线程安全的。在Java中,HashMap被广泛应用于各种场景,如缓存、数据库连接池、路由器等。
程序猿川子
2025/02/17
4780
Java HashMap详解及实现原理
Carson带你学Java:深入源码解析HashMap 1.8
在了解 如何计算存放数组table 中的位置 后,所谓 知其然 而 需知其所以然,下面我将讲解为什么要这样计算,即主要解答以下3个问题:
Carson.Ho
2022/03/25
5710
Carson带你学Java:深入源码解析HashMap 1.8
Java 8系列之重新认识HashMap
作者:美团点评技术团队 链接:https://zhuanlan.zhihu.com/p/21673805 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
bear_fish
2018/09/19
1.2K0
Java 8系列之重新认识HashMap
HashMap详解
**Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。**这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
程序员阿杜
2023/08/25
3910
Java HashMap工作原理及实现(干货)
发生了什么呢?下面是一个大致的结构,希望我们对HashMap的结构有一个感性的认识:
用户1257215
2018/07/27
1.6K0
Java HashMap工作原理及实现(干货)
【不做标题党,只做纯干货】HashMap在jdk1.7和1.8中的实现
Java集合类的源码是深入学习Java非常好的素材,源码里很多优雅的写法和思路,会让人叹为观止。HashMap的源码尤为经典,是非常值得去深入研究的,jdk1.8中HashMap发生了比较大的变化,这方面的东西也是各个公司高频的考点。网上也有很多应对面试的标准答案,我之前也写过类似的面试技巧(面试必备:Hashtable、HashMap、ConcurrentHashMap的原理与区别),应付一般的面试应该是够了,但个人觉得这还是远远不够,毕竟我们不能只苟且于得到offer,更应去勇敢的追求诗和远方(源码)。
猿人谷
2018/12/06
6960
【不做标题党,只做纯干货】HashMap在jdk1.7和1.8中的实现
从底层实现到应用场景:逐层探究HashMap类
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2023/11/26
5830
从底层实现到应用场景:逐层探究HashMap类
这可能是最细的HashMap详解了!
# 手撕HashMap源码 > 文章已同步至GitHub开源项目: [Java超神之路](https://github.com/shaoxiongdu/java-notes) ### HashMap一直是面试的重点。今天我们来了解了解它的源码吧! > 首先看一下Map的继承结构图 ![image-20210906151448379](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210906151448379.png) > 源码
程序员阿杜
2021/09/11
3060
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
小马哥学JAVA
2024/12/17
3750
Java 集合系列10: HashMap深入解析(2)
从中,我们可以看出 Entry 实际上就是一个单向链表。这也是为什么我们说HashMap是通过拉链法解决哈希冲突的。 Entry 实现了Map.Entry 接口,即实现getKey(), getValue(), setValue(V value), equals(Object o), hashCode()这些函数。这些都是基本的读取/修改key、value值的函数。
好好学java
2019/09/18
7710
HashMap框架源码深入解读,面试不用愁
在Java Collections Framework的体系中中,主要有两个重要的接口,一个是List、Set和Queue所属的Collection,还有一个就是Map接口了。在上一篇文章中介绍了List接口,它适用于按数值索引访问元素的情形。本文中将介绍的Map则提供了一个更通用的元素存储方法。
李红
2019/09/05
4140
【Java入门提高篇】Day22 Java容器类详解(五)HashMap源码分析(上)
准备了很长时间,终于理清了思路,鼓起勇气,开始介绍本篇的主角——HashMap。说实话,这家伙能说的内容太多了,要是像前面ArrayList那样翻译一下源码,稍微说说重点,肯定会让很多人摸不着头脑,不能把复杂的东西用尽量简单的方式说明白,那就说明讲的挺失败的(面壁中
弗兰克的猫
2018/06/16
6100
【Java入门提高篇】Day22 Java容器类详解(五)HashMap源码分析(上)
相关推荐
了解HashMap
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档