自己动手写HashMap
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的更多相关文章
- 3-自己动手写HashMap 增加哈希算法
public class HashMap { //存储元素数组 private Entry[] entry = null; //记录map个数 private int size; //构造器 publ ...
- 2-自己动手写HashMap
public class Entry { // 键 private Object key; // 值 private Object value; //构造器 public Entry(Object k ...
- 自己动手写web框架----1
本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...
- 自己动手写Android插件化框架
自己动手写Android插件化框架 转 http://www.imooc.com/article/details/id/252238 最近在工作中接触到了Android插件内的开发,发现自己这种技 ...
- 自己动手写一个服务网关-java
自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...
- 60行自己动手写LockSupport是什么体验?
60行自己动手写LockSupport是什么体验? 前言 在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockSupp ...
- 【原创】自己动手写控件----XSmartNote控件
一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...
- 【原创】自己动手写工具----XSmartNote [Beta 3.0]
一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了 ...
- 【原创】自己动手写工具----XSmartNote [Beta 2.0]
一.前面的话 在上一篇自己动手写工具----XSmartNote中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版ev ...
随机推荐
- Kali Linux来袭~老司机带你进击
Kali是BackTrackLinux完全遵循Debian开发标准彻底的完全重建.全新的目录框架,复查并打包所有工具,我们还为VCS建立了Git树. 本次推荐内容主要介绍Kali-Linux的安装,包 ...
- ElasticSearch安装拼音插件 elasticsearch-analysis-pinyin
elasticsearch-analysis-pinyin 是 ElasticSearch的拼音插件.强大的功能支持拼音等的搜索 1.下载源代码 源码地址https://github.com/medc ...
- [HTML] <meta name="viewport" content="width=device-width,initial-scale=1.0">释义
<meta name="viewport" content="width=device-width,initial-scale=1.0">这是 HT ...
- gulp 搭建个人工作流:文件注入、热启动、跨域
个人比价推崇前后端分离的开发方式,大家伙各司其职,只需通过 API 进行交流,不仅避免了沟通上的成本,更提升了开发效率.而在前端开发工作中,许多需求和问题是相似的,所以我们的开发模式往往是雷同的,是否 ...
- c++之函数形参和实参
c++之函数形参和实参讲解 1.非地址型参数 在c++中实现模块化编程时,我们形成会遇到对自定义的函数模块传入参数的操作,即形参.这里主要讲解一个非地址型的形参. 不多说,先看代码: #include ...
- Asp.net的生命周期应用之IHttpModule和IHttpHandler
摘自:http://www.cnblogs.com/JimmyZhang/archive/2007/11/25/971878.html 从 Http 请求处理流程 一文的最后的一幅图中可以看到,在Ht ...
- C#-WebForm-css box-shadow 给边框添加阴影效果
box-shadow介绍 css3可以使用 box-shadow 属性轻松地为元素添加阴影效果,box-shadow可以设定多组效果,每组参数值以逗号分隔. 语法: box-shadow:x-shad ...
- 【性能测试】:LR插入mysql数据库数据,脚本参数化问题
一,今天准备脚本做mysql数据库的铺地数据,脚本内容不赘述,在批量执行insert语句时候,出现一个问题: // sprintf(chQuery, "insert into table ( ...
- header请求头信息详细介绍
https://www.byvoid.com/zhs/blog/http-keep-alive-header HTTP协议头部与Keep-Alive模式详解 1.什么是Keep-Alive模式? 我们 ...
- (转)[小工具] Linux下列格式化工具 - column
当你看到Linux下命令输出的列歪歪扭扭时,是不是看着很不爽?column 命令就可以方便地解决这个问题. 比如: 我们一般就只用到上面这一个用法. column的其他用法如下: 选项 含义 -c 字 ...