HashMap是结合队列和链表各自的优点,创造的一种在查询和修改间取得性能平衡的一种集合!

MyMap接口:

package self;

//接口
public interface MyMap { public void put(Object key, Object value); public Object get(Object key); }

此处只实现了最常用的get和put方法。

HashMap实现:

package self;

//接口实现类
public class MyHashMap implements MyMap { private Node[] table;// 存放map数组 private int initSize;// map默认初始大小; public MyHashMap(int initSize) {
this.initSize = initSize;
this.table = new Node[initSize];// 创建对象时初始化大小
} @Override
public Object get(Object key) { int i = this.indexOf(key); Node node = this.table[i]; Object compareKey = node.getKey(); while (!key.equals(compareKey)) {
node = node.nextNode; if (node == null) {
break;
} else {
compareKey = node.getKey();
}
} if (node != null) {
return node.getValue();
} return null;
} @Override
public void put(Object key, Object value) { int i = this.indexOf(key); Node thisNode = new Node(key, value); if (table[i] != null) {
Node node = table[i];
Node next = node.nextNode;// node 关联的下一个node for (; next != null;) {
node = next;
next = node.nextNode;
} node.setNextNode(thisNode); } else {
table[i] = thisNode;
} } // 计算下标位置
private int indexOf(Object key) { if (key != null) {
return key.hashCode() % this.initSize;// hascode值除map大小取余
} return 0;
} // 内部类:map节点
private class Node {
private Object key;
private Object value;
private Node nextNode;// 指向的下一个节点 public Node(Object key, Object value) {
this.key = key;
this.value = value;
} public Object getKey() {
return key;
} public Object getValue() {
return value;
} public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
} } }

  1、采用最简单的: hash /  length 取余的方式去计算应存放的下标;(仅测试,实际java源码中的计算方式复杂的多)

  2、数组中存放的为Node对象,node.nextNode属性指向下一个对象;(同下标的数据通过此链表指向关联)

测试类:

package self;

import java.util.Date;

public class Test {

    public static void main(String[] args) {

        MyHashMap hashMap = new MyHashMap(3);

        hashMap.put("1", "111");
hashMap.put("2", "222");
hashMap.put(3, 333);
hashMap.put("4", "444");
hashMap.put("a", "aaa");
hashMap.put("b", "bbb");
hashMap.put("c", "ccc");
hashMap.put("d", "ddd"); System.out.println(hashMap.get(3));
}
}

自己动手写HashMap的更多相关文章

  1. 3-自己动手写HashMap 增加哈希算法

    public class HashMap { //存储元素数组 private Entry[] entry = null; //记录map个数 private int size; //构造器 publ ...

  2. 2-自己动手写HashMap

    public class Entry { // 键 private Object key; // 值 private Object value; //构造器 public Entry(Object k ...

  3. 自己动手写web框架----1

    本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...

  4. 自己动手写Android插件化框架

    自己动手写Android插件化框架 转 http://www.imooc.com/article/details/id/252238   最近在工作中接触到了Android插件内的开发,发现自己这种技 ...

  5. 自己动手写一个服务网关-java

    自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...

  6. 60行自己动手写LockSupport是什么体验?

    60行自己动手写LockSupport是什么体验? 前言 在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockSupp ...

  7. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  8. 【原创】自己动手写工具----XSmartNote [Beta 3.0]

    一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...

  9. 【原创】自己动手写工具----XSmartNote [Beta 2.0]

    一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...

随机推荐

  1. [真题] 一道 vsftp 运维题

    一道 vsftp 运维题 一.前言 在 V 站上凑巧看到了好友发的求助帖,五天时间一个理他的都没有.哈哈哈~ 废话不多说,我们来试试. 二.题目 这里我们假设存在这样的场景: 网络内有普通用户 ade ...

  2. 基于注解的Spring容器源码分析

    从spring3.0版本引入注解容器类之后,Spring注解的使用就变得异常的广泛起来,到如今流行的SpringBoot中,几乎是全部使用了注解.Spring的常用注解有很多,有@Bean,@Comp ...

  3. java项目迁移

    电脑重装系统以后或者从不同MyEclipse版本迁移项目时候会出现: Project facet Java 1.5 is not supported by target runtime Apache ...

  4. 关于类的成员,public,private修饰符

    类的成员要:属性,方法 属性:是它本身所居有的东西,比如人的特征,也可以这样理解属性是静态状态 方法:是这些属性通过方法行为发生改变,也就是方法是动态,可以对属性进行更新 public 公共的,可以被 ...

  5. jQuery 获取元素当前位置offset()与position()

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  6. [黑科技]跑的比fread还快的cin挂和cout挂

    CCPC赛后摸鱼搞了个新的奇怪外挂 这里贴上利用sgetn和sputn来实现的读入读出挂,理论上比fread更优 期望在赛中TLE的代码能强行卡过去hhh 利用小规模的Codeforces - 103 ...

  7. 在国内运行Flutter配置的正确姿势--如出现Oops; flutter has exited unexpectedly.

    如果根据flutter的官网教程,在运行flutter doctor时无法下载依赖,请根据以下步骤 export PUB_HOSTED_URL=https://pub.flutter-io.cn ex ...

  8. CKEditor图片上传实现详细步骤(使用Struts 2)

    本人使用的CKEditor版本是3.6.3.CKEditor配置和部署我就不多说. CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. ...

  9. (转)Windows上使用CMake

    CMake简介 原文:http://blog.gclxry.com/use-cmake-on-windows/ 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软 ...

  10. eclipse常用快捷键实践积累

    1. [Ctrl + D]:删除一整行 2. 给函数添加注释 [选中函数名]-[Alt + Shift + J].如果需要自定义注释内容可通过[项目]-[属性]-[Java代码样式]-[代码模板]-[ ...