手把手带你手撕HashMap

手撕HashMap HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间。本文主要基于JDK1.8之前的... 阅读详情

HashMap的优缺点

优点

  • 增删查找时间复杂度o(1)

缺点

  • key不能重复,在数据很多相同的时候不适合
  • 里面的内容是随机的不是有序的,所以面对有序的处理不行,比如说顺序输出
  • 还有就是要知道数组开辟的大小,如果开辟小了,hash冲突的很严重那么链表查询的时候时间就会增加,这时候就要扩容,那么里面所有的hash都需要重新进行hash存储了

怎么解决hash冲突

  • 开放地址法 (冲突了往下找)
  • 链表法 (数组里面放的是链表,这也是我们手撕的)
  • 公共溢出区法
  • 再hash法(就是在hash一次)

手撕hashmap

其实就是里面有一个数组(指针数组),里面放的是双向链表,双向链表里面放的是一个pair,pair里放的是key,value,单向的也可以(单向的删除要找的是删除元素的上一个,双向的找对应的就好)

class MyHashMap {
public:

   static int hsah(int key) {
        return key%size;
    }

    /** Initialize your data structure here. */
    MyHashMap():mymap_(size) {
    }
    
    /** value will always be non-negative. */
    void put(int key, int value) {
        int index = hsah(key);
        // cout<<"put"<<endl;
        // cout<<"index: "<<index<<endl;
        auto iter = mymap_[index].begin();
        while(iter!=mymap_[index].end()) {
            if(iter->first==key) {
                iter->second=value;
                return;
            }
            iter++;
        }
        mymap_[index].insert(mymap_[index].end(),{key,value});
    }
    
    /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
    int get(int key) {
        // cout<<"get: "<<key<<endl;

        int index = hsah(key);
        // for(auto i = mymap_[index].begin();i!=mymap_[index].end();i++) {
        //     cout<<i->first<<" "<<i->second<<" | ";
        // }
        // cout<<endl;

        auto iter = mymap_[index].begin();
        for(;iter!=mymap_[index].end();iter++) {
            if(iter->first==key) {
                return iter->second;
            }
        }
        return -1;

    }
    
    /** Removes the mapping of the specified value key if this map contains a mapping for the key */
    void remove(int key) {
        // cout<<"remove"<<endl;

        int index = hsah(key);
        for( auto iter = mymap_[index].begin();iter!=mymap_[index].end();iter++) {
            if(iter->first==key) {
                iter=mymap_[index].erase(iter); // 后面的迭代器虽然不会失效但是不能用++了
                // iter--;
                return;
            }
        }
    }


private:
    vector<list<pair<int,int>>> mymap_;
    static const int size = 572;


};

/**
 * Your MyHashMap object will be instantiated and called as such:
 * MyHashMap* obj = new MyHashMap();
 * obj->put(key,value);
 * int param_2 = obj->get(key);
 * obj->remove(key);
 */
UBUNTU使用RTL8811CU网卡(包含树莓派) 下载驱动 从绿联中下载:链接 下载解压后,chmod Linux文件夹 sudo chmod -R 777 ./Linux/ 修改系统的BOOT Secure为disable,参考链接:链接 sudo apt install mokutil sudo mokutil --disable-validation 重启电脑后,按照提示选择change secure boot state,并输入对应的字母(并不是全部密码,而是第几个),选择disable即可 进入Linux文件夹,运行命令 .. 阅读详情

相关推荐

Goose开源程序本地机上 AI 代理,能够从头到尾自动执行复杂的开发任务。Goose 不仅可以提供代码建议,还可以自主构建整个项目、编写和执行代码、调试故障、编排工作流程以及与外部 API 交互

Goose开源程序 是您的本机上 AI 代理,能够从头到尾自动执行复杂的开发任务。Goose 不仅可以提供代码建议,还可以自主构建整个项目、编写和执行代码、调试故障、编排工作流程以及与外部 API 交互。无论您是在构建想法原型、优化现有代码,还是管理复杂的工程管道,goose 都能适应您的工作流程并精确执行任务。

struggle2025的博客 2041

轻松手撕 HashMap

文章目录手撕 HashMapTreeMap分析哈希表 (Hash Table)哈希冲突 手撕 HashMap TreeMap分析 时间复杂度: 添加, 删除, 搜索: O(logn) 特点: Key 必须具备可比较性 元素的分布是有顺序的 在实际应用中, 很多时候的需求 Map 中存储的元素不需要讲究顺序 Map 中的 Key 不需要具备可比较性 不考虑顺序, 不考虑 Key 的可比较性, Map 有更好的实现方案, 平均时间复杂度可以达到 O(1) 那就是采取哈希表来实现 M

CoderZk的博客 1092

【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】

生成KEIL工程之后,勾选上use MicroLIB,代码上暂时无需做其他修改,编译下载。由于使用了FreeRTOS,因此系统的TimeBase Source修改成TIM1。在CubeMx上面选择NUCLEO-F429ZI开发板,并采用默认配置。打开电脑命令行,去ping这设置好的IP,能够实现Ping通。使能LWIP,并且先禁用DHCP,设置好静态IP。修改defaultTask的栈大小。Platform选择LAN8742。修改堆栈大小,生成工程。使能FreeRTOS。

qq_42617357的博客 6111

手撕 HashMap

手撕 HashMap 概述 我们先来看一张图,回顾一下之前学习的ArrayList、LinkedList、HashMap 补充说明 数组和链表迭代的方式不同 ArrayList实现了RandomAccess接口,这是一个标记接口,标注是否可以随机访问 ArrayList使用数组实现,可以随机访问,经过测试:使用for循环遍历ArrayList更快,而LinkedList没有实现这个RandomAccess接口,不支持随机访问,使用迭代器遍历更快 RandomAccess接口的作用 就是用来判断选择哪

JavaAlenboy 1180

MICROSAR OS:第一个task是如何执行起来的?

MICROSAR OS是Vector公司开发的符合AUTOSAR OS规范的实时操作系统。本文介绍MICROSAR

humu7733的博客 2570

实战避坑:在STM32上移植AUTOSAR BSW时,MCAL、ECU抽象层和服务层配置有哪些常见‘雷区’?

本文深入解析在STM32上移植AUTOSAR BSW时MCAL、ECU抽象层和服务层配置的常见陷阱,包括时钟树配置差异、GPIO电气特性问题、定时器资源冲突等实战经验。特别针对AUTOSAR架构在资源受限MCU上的特殊挑战,提供具体解决方案和优化策略,帮助开发者规避移植过程中的典型错误。

weixin_30258901的博客 561

面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种

以上就是HashMap中常用的7种遍历方式了,在工作中还是经常用得到的,所以希望小伙伴们能够记住并熟练使用哈。

JavaBuild的博客 1320

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

深度学习HashMap之手撕HashMap

在Java里,Object类里提供了一个默认的hashCode()方法,它返回的是一个32位int形整数,其实也就是对象在内存里的存储地址。也叫拉链法,看起来,像在桶数组上再拉一个链表出来,把发生哈希冲突的元素放到一个链表里,查找的时候,从前往后遍历链表,找到对应的key就行了。好了,哈希表的介绍就到这,相信你已经对哈希表的本质有了深刻的理解,接下来,进入coding时间。理想的情况,是每个数据元素经过哈希函数的计算,落在它独属的桶数组的位置。构造多个哈希函数,发生冲突时,更换哈希函数,直至找到空闲位置。

qq_45228323的博客 1205

C盘在同一时间突然多出100g的文件,请问是什么原因,以及是否能删除?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1762

[23]-->变长SPI接口

然而,FPGA技术复杂,学习门槛较高,许多人(初学者或学生)在学习过程中面临诸多挑战。(1)模式0:SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换,CPOL= 0,CPHA=0;(2)模式1:SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换,CPOL= 0,CPHA=1;(3)模式3:SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换,CPOL= 1,CPHA=1;

m0_46498597的博客 178

手把手带你写一个精简版 HashMap 的 put 方法

HashMap 大家工作中遇到的太多了,已经成了必须使用的类了, 在面试的时候 HashMap 基本是必问题,但是很多同学只是打开看过原理,没有真正的去研究过。里面是大佬写代码,为了性能和我们的业务代码写法差别很大,今天我带大家手写一个简单put 方法,保证用大家看得懂的代码来写。今天带着大家了手写了 HashMap 的 put方法,大家是不是感觉 HashMap 原来可以这么简单,看过还需要自己去试一下哟。下一节会给大家介绍 HashMap 的 get 方法,大家敬请期待。

一起成为更好的Java工程师 1597

OpenCV自学记录(1)——(一拳超人)图像处理基础(图像获取、图像变化)

学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。 OpenCV自学记录(1)——图像处理基础(一)1、图像获取1.1获取图像数据1.2 获取摄像头图像数据2、图像变化2.1 移动(translation)...

qq_40784418的博客 1455

金三银四面试必问源码:手把手轻松手撕HashMap源码

前言 HashMap 对每一个学习 Java 的人来说熟悉的不能再熟悉了,然而就是这么一个熟悉的东西,真正深入到源码层面却有许多值的学习和思考的地方,现在就让我们一起来探索一下 HashMap 的源码。 HashMap 源码分析 HashMap 基于哈希表,且实现了 Map 接口的一种 key-value 键值对存储数据结构,其中的 key 和 value 均允许 null 值,在 HashMap 中,不保证顺序,线程也不安全。 HashMap 中的数据存储 在 HashMap 中,每次 put

Java烂猪皮 266

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HashMap源码深度剖析,手把手带你分析每一行代码,包会!!!

手把手带你剖析HashMap源代码,从基本的数组长度函数设计,再到扩容非常奇妙的链表的指向,再到增删改查四个常用操作分析,一步一步带你深入HashMap内部~~~~

qq_45537774的博客 269

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

手把手带你分析HashMap源码-JDK1.8

文章目录HashMap的属性HashMap的构造函数HashMap常用函数1.put()/putVal()添加元素2.resize()扩容函数3.remove()删除函数4.get()获取元素函数5.replace()/replaceAll()修改元素函数 最近看了遍HashMap的源码,打算写一篇HashMap的源码解析,主要针对HashMap的增删改查操作进行分析,接下来直接进入正题。 先看看hashMap在jdk1.8的结构,用的是数组+链表+红黑树的结构,也叫哈希桶,在jdk1.8之前都是数组+链

一生信仰 8854

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Carson带你学Java:手把手带你源码分析 HashMap 1.7

前言 HashMap 在 Java 和 Android 开发中非常常见 今天,我将带来HashMap 的全部源码分析,希望你们会喜欢。 本文基于版本 JDK 1.7,即 Java 7 关于版本 JDK 1.8,即 Java 8,具体请看文章Java源码分析:关于 HashMap 1.8 的重大更新 目录 1. 简介 类定...

Carson带你学Android 4万+

HashMap源码深度剖析,手把手带你分析每一行代码

在前面的两篇文章哈希表的原理和200行代码带你写自己的HashMap(如果你阅读这篇文章感觉有点困难,可以先阅读这两篇文章)当中我们仔细谈到了哈希表的原理并且自己动手使用线性探测法实现了我们自己的哈希表。在本篇文章当中我们将仔细分析当中的源代码。首先我们需要了解的是一个容器最重要的四个功能 ,而我们也是主要根据这四个功能进行展开一步一步的剖析的源代码。在正式进行源码分析之前,先提一下:在当中实现的解决哈希冲突的办法是使用,而我们自己之前在文章200行代码带你写自己的HashMap当中实现的解决哈希冲突的办

aa119101的博客 340

红黑树最全手撕教程(建议马!)

ACM金牌得主带你手撕红黑树!1套视频 攻克数据结构难题补足短板 + 进阶突破本号读者0元领取要判断一个人的代码水平如何,不是看TA的代码量有多复杂,而是透过代码看TA的数据结构与算法。...

python爬虫人工智能大数据 1156

Carson带你学Java:深入源码解析HashMap 1.8

前言 HashMap 在 Java 和 Android 开发中非常常见 而HashMap 1.8 相对于 HashMap 1.7 更新多 今天,我将通过源码分析HashMap 1.8 ,从而讲解HashMap 1.8 相对于 HashMap 1.7 的更新内容,希望你们会喜欢。 本文基于版本 JDK 1.8,即 Java 8 关于版本 JDK 1.7,即 Java ...

Carson带你学Android 4万+

手把手带你写一个精简版 HashMap 的 get 方法

HashMap 大家工作中遇到的太多了,已经成了必须使用的类了, 在面试的时候 HashMap 基本是必问题,但是很多同学只是打开看过原理,没有真正的去研究过。里面是大佬写代码,为了性能和我们的业务代码写法差别很大,今天我带大家手写一个简单的 get 和 remove 方法,保证用大家看得懂的代码来写。需要看 put 方法实现的可以点开首页自己查找。最近2次课程带大家手写了HashMap的put、get、remove 几个核心的方法,大家一定要自己去尝试写着试试,这样才不会忘记。

一起成为更好的Java工程师 698

金三银四助力面试-手把手轻松读懂HashMap源码

掌握HashMap源码,为面试助力

zwx900102的博客 4407

手把手教你—HashMap底层原理

手把手教你—HashMap底层原理 前言 HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的是进大厂面试必问之一。 HashMap底层数据类型: Java1.8前:数组 + 链表; Java1.8后:数组 + 链表 + 红黑树; 那么我要知道数组和链表是什么? 数组特点 存储区间是连续,且占用内存严重,空间复杂也很大,时间复杂为O(1)。 优点:是随机读取效率很高,原因数组是连续(随机访问性强,查找速度快)。 缺点:插入和删除数据效率低

weixin_45282899的博客 1018

hashmap 存取原理图_手把手带你源码分析 HashMap 1.7

前言HashMap 在 Java 和 Android 开发中非常常见今天,我将带来 HashMap 的全部源码分析,希望你们会喜欢。目录1. 简介类定义publicclassHashMapextendsAbstractMapimplementsMap,Cloneable,Serializable主要介绍HashMap 的实现在 JDK 1.7 和 JDK 1.8 差别...

weixin_39540020的博客 117

阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal

对于,大家的第一反应可能是很简单呀,线程的变量副本,每个线程隔离。的 key 是弱引用,那么在的时候,发生GC之后,key 是否为null?中的数据结构?的Hash 算法?中Hash 冲突如何解决?的扩容机制?中过期 key 的清理机制?探测式清理和启发式清理流程?方法实现原理?方法实现原理?项目中使用情况?遇到的坑?……上述的一些问题你是否都已经掌握的很清楚了呢?本文将围绕这些问题使用图文方式来剖析的点点滴滴。

zxyhj的博客 1054

Java:手把手带你源码分析HashMap 1.7

HashMap源码分析JDK1.71、简介2、数据结构2.1 具体描述2.2 示意图2.3 存储流程2.4 数组元素 & 链表结点的 实现类3、基础知识:HashMap中的重要参数(变量)5、源码分析步骤1:HashMap类构造函数步骤2:向HashMap添加数据(成对 放入 键 - 值对)分析1:初始化哈希表分析2:当 key ==null时,将该 key-value 的存储位置规定为数组table 中的第1个位置,即table [0]分析3:计算存放数组 table 中的位置(即 数组下

qq_35387404的博客 545
上一篇: 简单化写法解决二分
下一篇: 同步异步IO阻塞非阻塞IO有缓存无缓存IO
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值