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. (四)SSO之CAS框架单点登录,自定义验证登录方式

    应需求的变化,在登录cas的时候,默认根据用户名和密码进行验证,如果加上用户名,密码和一个系统标识进行验证呢?该如何做呢? 我们知道cas默认的登录界面中,输入的用户名和密码,再配置一下deploye ...

  2. AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解

    上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用 ...

  3. leetcode-201-数字范围按位与

    题目描述: 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] ...

  4. linux下不同颜色文件的性质

    绿色文件: 可执行文件,可执行的程序 红色文件:压缩文件或者包文件 蓝色文件:目录 白色文件:一般性文件,如文本文件,配置文件,源码文件等 浅蓝色文件:链接文件,主要是使用ln命令建立的文件 红色闪烁 ...

  5. Python 全栈开发:dict(字典)常用方法操作、dict嵌套

    数据类型的划分:可变数据类型和不可变数据类型. 不可变数据类型(可哈希):元祖.bool.int.str 可变数据类型(不可哈希):list.dict,set(集合) dict(字典): dict(字 ...

  6. java防范跨站脚本攻击(XSS)

    网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加fi ...

  7. SpringMVC初写(一)SpringMVC的配置方式

    1.Spring概述a)SpringMVC是什么?SpringMVC是Spring框架内置的MVC实现.SpringMVC就是一个Spring内置的MVC子框架MVC:Model-View-Contr ...

  8. Mac 10.12搭建OpenVPN服务器以及客户端的使用

    说明:我未实践,大概就是这几个步骤,建议服务器在Linux下搭建效果会更好. 1.用brew下载openvpn brew install openvpn 2.命令行输入 openvpn --versi ...

  9. java中的POJO、PO、VO分别是什么?

    1.PO:persistant object 持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 2. VO:value object值对象. 通常 ...

  10. WCF系列教程之WCF客户端调用服务

    1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...