最新要闻
- 环球观速讯丨《生化危机4:重制版》DLC正在开发中 艾达王是你的了
- 每日快播:深圳暴雨致航班取消 旅客情绪崩溃 跪求起飞 机场回应
- 环球通讯!全明星的三大遗憾,成就了这场本土篮球盛宴的缺憾之美
- 实时焦点:RTX 4070定了!还是你们讨厌的192位显存
- 每日看点!彻底没救了!《Forspoken》发售2个月后:RTX 4090依旧无法60帧
- 【播资讯】100亿捐款建大学 曹德旺:对标美国斯坦福 每个学生补贴5万
- 每日信息:做出莫斯利安的光明乳业:掉队了
- 女员工请假做试管婴儿被拒遭辞退 法院判了:恢复合同
- 热消息:4月10日上市 福特F-150猛禽烈焰风暴特别版官图发布 为中国市场而
- 能抄底了?一汽奥迪补贴经销商清库存 明星车型降价近10万
- 每日看点!马云回国首谈ChatGPT:机器只有“芯”而人有“心”
- 国产车赢麻了!报告:中国品牌占俄罗斯新车销量近40%
- 焦点信息:“高端家用车”?比亚迪汉DM-i试驾 极致的油耗和空间
- 天天视讯!国产两轮电动车龙头!雅迪2022年营收310亿创纪录:电动自行车销量大增
- 速读:前备箱门锁失灵?特斯拉扩大召回进口Model S
- 京东方iPhone 15灵动岛屏被曝漏光 苹果搬来三星救火:提前生产
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界微资讯!手撕HashMap
【资料图】
HashMap基本了解
1、 jdk1.7之前,HashMap底层只是数组和链表2、 jdk1.8之后,HashMap底层数据结构当链表长度超过8时,会转为红黑树3、 HashMap利用空间换时间的思想,将键值对一个个散落在集合中4、 hashcode值通过调用hashcode()方法得到,所以有可能存在hashcode值相同的情况,即所谓的哈希冲突5、手撕hashmap的思路:6、存储put():
- Map有一个封装的内部接口Entry
,用来将key和value封装成键值对对象 - 键值对对象根据计算的hashcode值进行存储
- hashmap的特点
- key不能重复
- 当key重复时,会把原有的键值对替换成新的键值对
7、取值get():
- 先调用hashcode方法进行计算,判断是否存在
- 存在则在链表中进行equals方法一一比较他们的key
- key值不重复
手撕HashMap
1、首先需要一个Map接口,其中定义我们的put()、get()、hashcode()等方法
public interface FakeMap { /** * 将键值对存入我们自己实现的FakeMap中 * @param key 传入的key * @param value key所对应的值 */ void put(K key,V value); /** * 通过传入key来获取对应的值 * @param key 传入的key * @return 返回key对应的值,没有则返回null */ V get(K key); /* 说明: hashmap所使用的hashcode方法应该来自于key本身提供 1、我们在模拟hashmap时,需要保证hashcode值的范围,不能超过数组的下表 2、jdk1.8之后接口内可以写静态方法和default方法 3、如果两个对象的hashcode相同,对象不一定相同; 如果对象相同,hashcode一定相同 */ /** * 自己定义的hashcode方法 * @param key 需要计算hashcode值的key * @return int类型的hashcode值,人为地将值限制在了0-1999 */ default int hashcode(K key){ return key.toString().hashCode()%2000; }}
2、需要一个Entry类,用来用我们传入的键值对生成键值对对象
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class Entry { private K key; private V value;}
3、需要一个Map的实现类,用来实现Map中的各个方法
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class FakeHashMap implements FakeMap { /** * 定义一个数组,数组的下标和hashcode值对应,用来存放链表的地址 */ LinkedList>[] mapArr = new LinkedList[2000]; /** * 不需要遍历数组,大大减少了代码量,直接存入hashcode的值 * 用来记录被使用的hashcode,方便后续其他方法的操作 */ List hashcodeList=new ArrayList<>(); /** * 将键值对存入我们自己实现的FakeMap中 * @param key 传入的key * @param value key所对应的值 */ @Override public void put(K key, V value) { //根据key计算出key对应的hashcode值 int hashcode = hashcode(key); //hashcode值对应的是数组的下标,应该先判断下标对应的链表是否存在,不存在就先创建 if (null == mapArr[hashcode]) { //创建一个链表,并且将我们的key和value封装成键值对对象Entry并存入链表 Entry entry = new Entry(key,value); //链表的内存地址存入数组对应的下标处 mapArr[hashcode] = new LinkedList<>(); mapArr[hashcode].add(entry); hashcodeList.add(hashcode); } else { //链表存在说明之前已经有键值对存入,需要我们进行判断 //需要遍历这个链表:1、如果找到key相同的,则更新链表替换 2、如果没有找到,直接新建对象存入 boolean found = false; loop: for (Entry entry : mapArr[hashcode] ) { if (entry.getKey().equals(key)) { entry.setValue(value); found = true; //若找到则退出循环 break loop; } } if (!found) { mapArr[hashcode].add(new Entry(key, value)); } } } /** * 通过传入key来获取对应的值 * @param key 传入的key * @return 返回key对应的值,没有则返回null */ @Override public V get(K key) { int hashcode = hashcode(key); //如果发现没存过,直接返回空 if (null == mapArr[hashcode]) { return null; } else { //如果遍历能查找到key,则根据key取出对应的下标的值,返回value //如果遍历不能找到,则返回null for (Entry entry : mapArr[hashcode] ) { if (entry.getKey().equals(key)) { return entry.getValue(); } } } return null; }}
4、最后写一个测试类,测试我们自己手搓的hashmap
- 传入三个键值对,其中前两个的key值相同,看看是否会自己更新value值
public class Test { public static void main(String[] args) { FakeMap fm = new FakeHashMap<>(); fm.put("ikun","zhangsan"); fm.put("ikun","lisi"); fm.put("boy","wangwu"); System.out.println(fm.get("ikun")); System.out.println(fm.get("boy")); }}
5、测试结果:可以发现lisi替换掉了同样是ikun的zhangsan
6、补充:HashMap还有很多其他的方法,我这里没有全部手撕下来,但是可以根据put和get的思路来做
- 具体实现的话就是在接口中定义新的方法,并且在实现类中实现再去测试就完事了
/** * 删除传入的key值所对应的键值对对象 * * @param key 传入的key */ void remove(K key); /** * 清除 HashMap 中的所有关联或者映射 */ void clear(); /** * 判断是否存在key值所对应的映射,返回一个布尔值 * * @param key 传入一个key的值 * @return 判断是否存在key值所对应的映射,返回一个布尔值 */ boolean containsKey(K key); /** * 获取HashMap的键的集合,以Set保存 * * @return 返回key的集合 */ Set keySet(); /** * 得到 HashMap 中各个键值对映射关系的集合 * * @return 返回一个映射关系的集合 */ Set> entrySet(); /** * 将指定所有的键值对插入到 HashMap 中 * * @param fakeMap 包含插入到 HashMap 的映射关系 */ void putAll(FakeMap fakeMap); /** * 得到 HashMap 键值对的数量 * * @return 一个int型整数 */ int size(); /** * 获取HashMap中value的集合 * * @return 返回value集合 */ Collection values();
关键词:
-
第134篇:解决浏览器的CORS跨域问题(CORS policy: Cross origin requests are only supported for p
好家伙,我继续尝试着将我的飞机大战使用ES6模块化分离开来,出了点问题1 出现问题:edge,chrome等一系列...
来源: 世界微资讯!手撕HashMap
每日资讯:一些面试高频题目
Synchronized详解
第134篇:解决浏览器的CORS跨域问题(CORS policy: Cross origin requests are only supported for p
环球观速讯丨《生化危机4:重制版》DLC正在开发中 艾达王是你的了
每日快播:深圳暴雨致航班取消 旅客情绪崩溃 跪求起飞 机场回应
环球通讯!全明星的三大遗憾,成就了这场本土篮球盛宴的缺憾之美
【Visual Leak Detector】配置项 AggregateDuplicates
Python毕业设计推荐
实时焦点:RTX 4070定了!还是你们讨厌的192位显存
每日看点!彻底没救了!《Forspoken》发售2个月后:RTX 4090依旧无法60帧
【播资讯】100亿捐款建大学 曹德旺:对标美国斯坦福 每个学生补贴5万
每日信息:做出莫斯利安的光明乳业:掉队了
女员工请假做试管婴儿被拒遭辞退 法院判了:恢复合同
环球观察:Vue 核心(二)
观焦点:HDFS Short-Circuit Local Reads
货币市场日报:3月27日
热消息:4月10日上市 福特F-150猛禽烈焰风暴特别版官图发布 为中国市场而
能抄底了?一汽奥迪补贴经销商清库存 明星车型降价近10万
每日看点!马云回国首谈ChatGPT:机器只有“芯”而人有“心”
国产车赢麻了!报告:中国品牌占俄罗斯新车销量近40%
焦点信息:“高端家用车”?比亚迪汉DM-i试驾 极致的油耗和空间
天天视讯!国产两轮电动车龙头!雅迪2022年营收310亿创纪录:电动自行车销量大增
焦点!通胀压力缓解避险情绪收敛 日债收益率周一全线回升
世界速读:商品日报(3月27日):沪锡领涨纯碱09合约增仓上行 苹果大幅下挫跌超4%
速读:前备箱门锁失灵?特斯拉扩大召回进口Model S
京东方iPhone 15灵动岛屏被曝漏光 苹果搬来三星救火:提前生产
天天热点评!女子赏花站梨树枝头甩衣狂摇 拍摄者:花瓣掉落一地
观热点:女子吃自助餐将店内甲鱼煮食 网友:是个狠人
乌鲁木齐周生生黄金价格多少钱一克(2023年3月27日)
新动态:CodeIgnitor 3.0.x 之 db 类实现机制
第一次博客
环球热点评!小皮Windows web面板漏洞详解
世界观速讯丨【原型设计工具】上海道宁为您提供Justinmind,助力您在几分钟内形成原型,并现场测试,无需编写任何代码
女生从俄罗斯花2分钟回国吃麻辣烫 挑战全网最短留学距离:网友感慨真近
环球观点:文心一言升级版!百度发布企业级大模型服务平台“文心千帆”
当前速讯:太危险!女子驾驶保时捷玩具车上机动车道吓坏路人:自称为了好玩
承认造假丑闻!百年日企川崎重工形象崩塌:鞠躬道歉
资讯推荐:男子跑滴滴1单挣了3148元:光等待费就两千多元
环球要闻:从GPT-4、文心一言再到Copilot,AIGC卷出新赛道?
即时:【必须收藏】别再乱找TiDB 集群部署教程了,这篇保姆级教程来帮你!!| 博学谷狂野架构师
当前关注:C#多态性学习,虚方法、抽象方法、接口等用法举例
python中index()、find()方法
每日视点!便宜香港主机推荐
环球速递!秒变大屏平板!三星将推新款折叠手机:双铰链、三折叠
天天报道:专家评中国为何没跟上ChatGPT浪潮:0-1的事情没人做
电动车价格还得降 宁德钠离子电池今年量产:高寒地区突出优势
广汽埃安新车慢充失灵 车主:4S店给补偿 但协议他不想签
天天热推荐:日本声优网络发文吐槽外送被打翻 网友:小心隐私
天天精选!批量上传iOS应用程序截图的实用技巧
天天热头条丨OPPO发布新机|无感验证护航“黄牛党”退退退!
环球滚动:易基因:肠道菌群:早产儿出生后不同时间点肠道微生物定植的动态变化|项目文章
快播:Qt 博客汇总
天天热推荐:图片识别文字(批量图片文字查找分类)
普京称嫉妒的人才说俄依赖中国 欧洲应该想想自己
科创板收盘播报:科创50指数探底回升跌0.33% 软件服务类个股表现强势
甲醛滤芯永不更换!米家全效空气净化器评测:不仅除尘、还能杀死H1N1病毒
顺丰开通贵州茅台首条全货机航线 10余吨酒、茶特产首飞成功
每日资讯:飞机航班为何不卖站票?大V科普:并非航空公司良心
罕见5风扇设计!铭瑄RTX 4070 Ti MGG OC12G显卡图赏
三电升级、寿命翻倍!绿源液冷2.0系统升级上线:能骑十年
Transformer详解
全球速递!解决google翻译出错问题
世界通讯!【高端访谈】“开放的中国大市场蕴藏更多新机遇”——访马士基首席执行官柯文胜
以铜之名尽显千年风流
全球信息:打造中国ChatGPT 搜狗输入法之父马占凯加入王慧文AI团队
独一无二木星纹理见过么?一加11推出木星岩限定版:100%手工挑选
环球快看:曾被宣布“野外灭绝” 长江鲟时隔23年首次自然产卵
当前速读:ubuntu 使用vsftpd搭建FTP服务器
全球热议:6.824-lab2-Raft简述
环球滚动:Template模板类
全球讯息:【Visual Leak Detector】配置项 VLD
【速看料】火山引擎 DataTester:构建增长闭环,3-5 人即可搭建企业增长团队
【新要闻】曾因配料“双标”遭网友痛批 好丽友漏税22万被罚12万
全球时讯:空姐为美容注射玻尿酸:打进血管 险丧命
三星W799哪年上市的?三星W799可以安装微信吗?
诺基亚920还能用吗?诺基亚920手机参数
英雄联盟手游大师多少颗星上宗师?英雄联盟几级可以组队匹配?
总线上的音频设备前是感叹号是什么原因?总线上的音频设备前是感叹号怎么处理?
华为合约机是什么意思?华为合约机和官方标配区别有哪些?
C#遍历指定文件夹中所有文件的3种方法
天天热议:Sed 备忘清单_开发速查表分享
史上最严奶粉新国标实施逾月 贝因美又一款二注奶粉上新 哪些信号值得关注?
热推荐:甘肃将为兰州牛肉拉面立法 网友:建议牛肉有重量标准
热点在线丨《原神》地位不保?开放世界游戏《鸣潮》实机画面公布
环球简讯:曹德旺:大学生去送外卖 和在学校没学到东西有关
任性钻“夹缝”被撞旋转1080° 司机甩锅:都怪后车开太快了
当前快播:判赔370万!中创新航回应不正当竞争案判决:未曾挖角宁德时代 将上诉
天天百事通!OpenIddict使用教程
流量分析入门
全球观速讯丨MySql随笔记基础
【高端访谈】强化城投债与量化领域主动管理 打造私募“固收+”独特策略——专访国恩资本董事总经理杨先哲
通讯!旃怎么读音(旃怎么读)
36年前电脑用上AI:IBM 5155运行ChatGPT是什么样?
环球看热讯:清晰度和功耗完美平衡!真我GT Neo5系列宣布告别1080P:普及1.5K屏
罕见!超级火流星划过北京夜空被拍下:彩色拖尾 爆裂闪光
每日快讯!《生化危机4:重制版》阿什莉模型展示:物理晃动效果很优秀
全球快看点丨车评人曝奔驰4S维修黑幕:一个迈巴赫大灯小20万 故意损坏夸大车损
即时:数据库系统原理之SQL与关系数据库基本操作
每日焦点!【解答】如何保障ETL过程的数据正确性。这个过程会产生哪些问题?