自定义实现HashMap(二)
今天看了一下自己的 简单实现HashMap,发现好多问题,今天又重新实现了一下,整体思想还是基于数组加链表的形式实现的。思路如下:数组下挂了一个个链表。
首先创建一个类作为链表。很简单 只是简单的记录了一下Key,Value,以及 下一个节点(学过C语言的同学,可以理解成指针),默认构造方法,以及传参构造方法。
/*** 自定义链表* @param <K,V>*/
public class Node<K,V> {//当前Keyprivate K key;//当前Keyprivate V value;//指针private Node<K,V> next;public Node(){}public Node(K key, V value) {this.key = key;this.value = value;}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 Node<K, V> getNext() {return next;}public void setNext(Node<K, V> next) {this.next = next;}
}
然后在实现 hashMap的get和put方法。其中要注意的是java中的值传递和引用传递(https://blog.csdn.net/bntx2jsqfehy7/article/details/83508006),可以参考一下这个帖子。
/*** 自定义 HashMap* 主要通过 hashMap的可以计算Key Hash值* 然后将 hash值进行取余,然后 将取余的值作为下标,将内容放在改 item下的链表中*/
public class MyHashMap<K,V>{Integer iniSize = 16;Node<K,V>[] nodes = null;public MyHashMap() {this.nodes = new Node[iniSize];}public MyHashMap(Integer size) {this.nodes = new Node[size];this.iniSize = size;}public void put(K k,V v) throws Exception{//判断Key是否已经存在Integer i = getIndex(k);//如果是该下标的第一个节点if(null == nodes[i]){nodes[i] = new Node<>(k,v);}else{Node node = findNode(nodes[i],k);//如果Key存在if(null!=node){throw new Exception("key不能重复");}else{//key不存在,直接加在链表下面 (如果Hashcode值发生碰撞解决)addNode(nodes[i],k,v);}}}public V get(K k){Integer i = getIndex(k);Node<K, V> indexNode = nodes[i];Node node = findNode(indexNode, k);return (V) node.getValue();}//计算下标private Integer getIndex(K k){String putKey = String.valueOf(k);Integer index = putKey.hashCode()%iniSize;return index;}//链表递归查询节点,根据首节点 key值private Node findNode(Node node,K k){if(node == null){return null;}Object key = node.getKey();if(!key.equals(k)){return findNode(node.getNext(),k);}else{return node;}}//链表递归查询最后的节点private Node findLastNode(Node node){//如果是该下标的第一个节点if(null == node){return null;}Node next = node.getNext();if(null!=next){findLastNode(next);}else{return node;}return null;}//链表增加节点,首个节点,Key,Valueprivate void addNode(Node node,K k,V v){Node lastNode = findLastNode(node);Node newNode = new Node(k,v);lastNode.setNext(newNode);}
}
最后测试Main方法
public static void main(String[] args) throws Exception {System.out.println(String.format("Aa的HashCode是%s ","Aa".hashCode()));System.out.println(String.format("BB的HashCode是%s ","BB".hashCode()));//设置一样HashCode的值MyHashMap<String,Integer> myHashMap = new MyHashMap<String, Integer>();myHashMap.put("Aa",1);myHashMap.put("BB",2);//获取值Object value = myHashMap.get("BB");System.out.println(value);}
打印的值如下:
Aa的HashCode是2112
BB的HashCode是2112
2
自定义实现HashMap(二)相关推荐
- php 二维数组排序函数,php自定义函数实现二维数组排序功能
本文实例讲述了php自定义函数实现二维数组排序功能.分享给大家供大家参考,具体如下: /**作用: 二维数组排序函数,支持多键名排序 * 返回: 排序好的数组 * 使用: array_msort(数组 ...
- 精通Android自定义View(十二)绘制圆形进度条
1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...
- 项目实践系列-点击生成自定义设置的二维码
目前为止,生活中的我们到处可见一些二维码,使用微信扫一扫即可进入到另一个网络空间,这种方式方便了我们的生活,更让我们可以适应这种方式. 那么今天呢,我就个人项目经历,把点击生成自定义设置的二维码的一个 ...
- 236_自定义抽签器二
自定义抽签器二 分好扇形之后要在扇形的中间加上文字 难点在如何计算出扇形的中心 挺难的 @Override protected void onDraw(Canvas canvas) { ...
- java自定义表单系统_自定义表单二次开发
自定义表单二次开发 === 自定义表单的页面和业务逻辑增强采用JS增强和Java增强实现.![输入图片说明](https://static.oschina.net/uploads/img/201804 ...
- Android自定义动画专题二
android自定义动画专题二 在上篇文章中给大家介绍了android自定义动画的第一种表现形式:view的绘制:不过这只是一种单纯利用自定义控件绘制的方式去实现:这篇文章会给大家演示如何通过自定义控 ...
- STM32自定义键盘(二)STM32单片机的USB接口-HID键盘
STM32自定义键盘(二)STM32单片机的USB接口-HID键盘 HID描述符 生成HID键盘工程模板 修改HID报告描述符 键值数据发送 USB HID 键盘键值表 HID描述符 请参考这位博主的 ...
- 自定义view(二)
这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...
- 自定义实现HashMap(简单实现)
/*** @author ZhangHaiWen </a>* @create 2018/8/8 0008* @desc 自定义的HashMap**/public class MyHashM ...
最新文章
- 隐藏在mock之后的‘快感’
- CMFCTABCTRL 简介及BUG处理
- java商城管理系统ssm_基于SSM+MYSQL的一个小型商城网站后台管理系统
- mysql数据库 数据类型自动编号选哪个_MySQL表类型、选择合适数据类型、字符集...
- 如何记忆英语的成语、俗语等
- CERC2017 Gambling Guide,最短路变形,期望dp
- Effective C# 原则48:了解更多的工具和资源(译)
- 一分钟看懂mysql_冬天发财树“最怕”它,遇上就烂根,一分钟看懂就能养好
- sitemap.xml生成方法(asp和php)(转)
- vue.js学习资源大全
- 深入理解 ViewState
- python2.7安装pyqt4及转换ui文件为py文件
- [数据库】sql 查询语句 汇总
- 三星linux电视软件下载中心,Samsung Smart View下载-Samsung Smart View免费版-最火软件站...
- Unity PlayerSetting设置
- ap漫游测试软件,AC+AP方案选择,TP无缝漫游强过UBNT?胖AP如何实现802.11r?
- 如何创建计算机的桌面快捷方式,什么是快捷方式、如何创建快捷方式?
- 西门子 HTML控件 上不了网,Win10系统在西门子PLC调试中以太网连接异常处理办法...
- Web爬虫|入门实战之实习僧(编码反爬)
- 秦羽接引的鸿蒙第四人,星辰变:秦羽用过的法宝一件比一件厉害,最后一件直接逆天改命!...