自己写一个HashMap
2018-03-19 16:54
302 查看
前言 (Foreword)
最近操作系统实验感觉一直在copy,copy。。。嗯,不是感觉。连个HashMap自己都懒得写。许久之前看过【码农翻身】的《什么是HashMap》,推荐一下这个公众号(码农翻身),炒鸡棒!看过这篇推送后一直没有实现。今天终于可以拿起笔来写一写。写的有什么不对的请指出,勿喷。原理 (Theory)
HashMap是一种以键值对存储数据的数据结构,简单的来说是这样。内部怎么实现的呢?实际上使用一个数组(entries),然后数组中的每一个元素可以看成是一个链表(entry)。当存储一个键值对时,你拿着一个Key和Value,哈希算法会根据你的Key来计算出一个值,我们把这个值当作内部数组(entries)的索引值(index),然后找这个索引值下的元素来存储value值,如果此索引下已经存在元素,但因为每个数组元素(entry)可以看作是链表可以连着存储,故可以插入该索引。只不过这里是头插法,因为某种不可抗力会更有可能查询刚插入的元素。先看一下代码,虽然写的很糟,如果实在不能理解,请看一下【码农翻身】上面给了链接。代码(Code)
这是源代码
public class MyHashMap<K,V> { private static int default_length=16; private MyEntry<K, V>[] entries; public MyHashMap() { super(); entries = new MyEntry[default_length]; } public V put(K key,V value) { int index = key.hashCode()%default_length; MyEntry<K, V> previous = entries[index]; for(MyEntry entry=entries[index];entry!=null;entry = entry.next) { if(entry.getKey().equals(key)) { V oldValue = (V) entry.getValue(); entry.setValue(value); return oldValue; } } MyEntry<K, V> entry = new MyEntry<>(key,value); entry.next=previous; entries[index] = entry; return null; } public V get(K key) { int index = key.hashCode()%default_length; for(MyEntry<K, V> entry=entries[index];entry!=null;entry=entry.next) { if(entry.getKey().equals(key)) { return entry.getValue(); } } return null; } private final class MyEntry<K,V> { private K key; private V value; private MyEntry next; public MyEntry(K key, V value) { super(); this.key = key; this.value = value; } public MyEntry() { super(); } public MyEntry(K key, V value, MyEntry next) { super(); this.key = key; this.value = value; this.next = next; } public K getKey() { return key; } public void setKey(K key) { this.key = key; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } public MyEntry getNext() { return next; } public void setNext(MyEntry next) { this.next = next; } } }
这是测试代码
public class HashTest { public static void main(String[] args) { MyHashMap<String, Integer> mhm = new MyHashMap<>(); mhm.put("lmy", 20); System.out.println(mhm.get("lmy")); } }
这是结果
相关文章推荐
- java 自己写的一个hashmap排序
- 理解JAVA HashMap的原理,根据源码原理 自己 动手写一个 MyHashMap
- 自己实现一个简单版的HashMap
- 利用HashMap,自己实现一个简易版的HashSet
- JS中自己实现一个HashMap
- 自己写的一个Java Bean转换为HashMap及ArrayList容器的功能类,支持Hibernate
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- python开发_自己开发的一个小游戏
- 分享一个自己利用javascript中的window.setInterval()定时器实现页面背景图片变换的特效(同时淡入淡出效果)
- android注解入门 并来自己写一个框架
- 如何开发一个自己的移动OS?(转)
- 自己写的一个图形验证码页面(Asp.Net2.0通过)
- BIOS/UEFI基础——写一个自己的shell命令
- 网上只写了一个文件断点下载的例子! 我仿照别人得例子 自己增加了自己代码,异步下载文件 支持断点下载 多任务下载! 如有问题 请联系我
- Android 一个抽奖应用的逆向破解全流程之加固自己应用
- 自己联系的一个小perl
- 自己做的一个类似MSN弹出消息的框框的自定义控件
- 如何写一个给自己的框架写一个优雅的Java Config模块(四)
- 我只是一个卖煎饼果子的,你跟我谈个鸡毛营销战略,这么牛B自己敲钟去啊 ...
- 自己用10分钟写了一个猜数字的小游戏娱乐室友