今天看了一下自己的 简单实现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(二)相关推荐

  1. php 二维数组排序函数,php自定义函数实现二维数组排序功能

    本文实例讲述了php自定义函数实现二维数组排序功能.分享给大家供大家参考,具体如下: /**作用: 二维数组排序函数,支持多键名排序 * 返回: 排序好的数组 * 使用: array_msort(数组 ...

  2. 精通Android自定义View(十二)绘制圆形进度条

    1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...

  3. 项目实践系列-点击生成自定义设置的二维码

    目前为止,生活中的我们到处可见一些二维码,使用微信扫一扫即可进入到另一个网络空间,这种方式方便了我们的生活,更让我们可以适应这种方式. 那么今天呢,我就个人项目经历,把点击生成自定义设置的二维码的一个 ...

  4. 236_自定义抽签器二

    自定义抽签器二 分好扇形之后要在扇形的中间加上文字 难点在如何计算出扇形的中心 挺难的 @Override     protected void onDraw(Canvas canvas) {     ...

  5. java自定义表单系统_自定义表单二次开发

    自定义表单二次开发 === 自定义表单的页面和业务逻辑增强采用JS增强和Java增强实现.![输入图片说明](https://static.oschina.net/uploads/img/201804 ...

  6. Android自定义动画专题二

    android自定义动画专题二 在上篇文章中给大家介绍了android自定义动画的第一种表现形式:view的绘制:不过这只是一种单纯利用自定义控件绘制的方式去实现:这篇文章会给大家演示如何通过自定义控 ...

  7. STM32自定义键盘(二)STM32单片机的USB接口-HID键盘

    STM32自定义键盘(二)STM32单片机的USB接口-HID键盘 HID描述符 生成HID键盘工程模板 修改HID报告描述符 键值数据发送 USB HID 键盘键值表 HID描述符 请参考这位博主的 ...

  8. 自定义view(二)

    这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...

  9. 自定义实现HashMap(简单实现)

    /*** @author ZhangHaiWen </a>* @create 2018/8/8 0008* @desc 自定义的HashMap**/public class MyHashM ...

最新文章

  1. 隐藏在mock之后的‘快感’
  2. CMFCTABCTRL 简介及BUG处理
  3. java商城管理系统ssm_基于SSM+MYSQL的一个小型商城网站后台管理系统
  4. mysql数据库 数据类型自动编号选哪个_MySQL表类型、选择合适数据类型、字符集...
  5. 如何记忆英语的成语、俗语等
  6. CERC2017 Gambling Guide,最短路变形,期望dp
  7. Effective C# 原则48:了解更多的工具和资源(译)
  8. 一分钟看懂mysql_冬天发财树“最怕”它,遇上就烂根,一分钟看懂就能养好
  9. sitemap.xml生成方法(asp和php)(转)
  10. vue.js学习资源大全
  11. 深入理解 ViewState
  12. python2.7安装pyqt4及转换ui文件为py文件
  13. [数据库】sql 查询语句 汇总
  14. 三星linux电视软件下载中心,Samsung Smart View下载-Samsung Smart View免费版-最火软件站...
  15. Unity PlayerSetting设置
  16. ap漫游测试软件,AC+AP方案选择,TP无缝漫游强过UBNT?胖AP如何实现802.11r?
  17. 如何创建计算机的桌面快捷方式,什么是快捷方式、如何创建快捷方式?
  18. 西门子 HTML控件 上不了网,Win10系统在西门子PLC调试中以太网连接异常处理办法...
  19. Web爬虫|入门实战之实习僧(编码反爬)
  20. 秦羽接引的鸿蒙第四人,星辰变:秦羽用过的法宝一件比一件厉害,最后一件直接逆天改命!...

热门文章

  1. sleep函数_VBA代码方案82:如何利用代码让程序延时,SLEEP和timeGetTime及两个API函数讲解...
  2. 【运维心得】双宽带热备方案推荐
  3. 2017(第三届)智能制造国际论坛即将盛大召开
  4. opencv生成彩色图c++代码实例及运行结果
  5. Python递归函数练习
  6. vue仿抖音视频列表(兼容微信内置X5浏览器)
  7. CART与C4.5的区别
  8. 环境变量的用户变量与系统变量的简单说明
  9. webots导入solidworks模型
  10. 多人对战游戏开发实例之《组队小鸡射击》(附源码)