package com.jl.testmap;

/**
* 自定义一个HashMap
* @author JiangLai
*
*/
public class MyHashMap<K,V> { Node<K,V>[] table;//位桶数组
int size;//存放键值对的个数 public MyHashMap() {
table = new Node[16];//长度一般定义为2的整数次幂
} public void put(K key,V value) { //定义新的节点对象
Node newNode = new Node();
newNode.hash = myHash(key.hashCode(), table.length);
newNode.key = key;
newNode.value = value;
newNode.next = null; Node temp = table[newNode.hash]; Node itorLast = null;//正在遍历的最后一个元素 if(temp==null) {
//此处数组元素为空,则直接将新节点放入
table[newNode.hash] = newNode;
size++;
}else {
//此处数组元素 不为空,则遍历整个链表
while (temp!=null) {
//判断key是否重复,相同则替换,
if(temp.key.equals(key)) {
temp.value = value;//只是覆盖value即可,其他的值不变。(hash,key,next)
break;
}else {//如果不重复,则遍历下一个
itorLast = temp;
temp = temp.next;
} } if(itorLast!=null) {
itorLast.next = newNode;
size++;
}
}
} public V get(K key) { int hash = myHash(key.hashCode(), table.length); Object value = null; if(table[hash] != null) {
Node<K,V> temp = table[hash];
while (temp!=null) {
if(temp.key.equals(key)) {//如果相等,则返回对应的值
value = temp.value;
break;
}else {
temp = temp.next;
}
}
} return (V)value;
} //计算Hash值
public int myHash(int v,int length) {
//二者作用一样
// System.out.println(v&(length-1));//直接位运算,效率高.
// System.out.println(v%(length-1));//取余运算,效率低.
return v&(length-1);
} @Override
public String toString() {
//{10:aa,20:bb}
StringBuilder sb = new StringBuilder("{"); //遍历数组
for(int i=0;i<table.length;i++) {
Node<K,V> temp = table[i];//当前元素
//遍历链表
while (temp!=null) {
//当前元素的key和value
sb.append(temp.key+":"+temp.value+",");
//当前元素的下一个元素
temp = temp.next;
}
} sb.setCharAt(sb.length()-1, '}'); return sb.toString();
} public static void main(String[] args) {
MyHashMap<Integer,String> map01 = new MyHashMap<>();
map01.put(10, "001");
map01.put(20, "002"); System.out.println(map01); System.out.println(map01.get(10));
} }
package com.jl.testmap;

/**
* 用于TestHashMap中
* @author JinagLai
*/
public class Node<K,V> { int hash;//HashCode
K key;//键
V value;//值
Node<K,V> next;//下一个节点 }

理解HashMap底层原理,一个简单的HashMap例子的更多相关文章

  1. 最简单的HashMap底层原理介绍

    HashMap 底层原理  1.HashMap底层概述 2.JDK1.7实现方式 3.JDK1.8实现方式 4.关键名词 5.相关问题 1.HashMap底层概述 在JDK1.7中HashMap采用的 ...

  2. HashMap底层原理

    原文出自:http://zhangshixi.iteye.com/blog/672697 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射 ...

  3. hashMap 底层原理+LinkedHashMap 底层原理+常见面试题

    1.源码 java1.7    hashMap 底层实现是数组+链表 java1.8 对上面进行优化  数组+链表+红黑树 2.hashmap  是怎么保存数据的. 在hashmap 中有这样一个结构 ...

  4. HashMap底层原理分析(put、get方法)

    1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...

  5. 一个简单的CORBA例子

    因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...

  6. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下   我们先来实现一个简单的例子,hello world ...

  7. 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)

    使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...

  8. 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...

  9. 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...

  10. 一个简单的cmake例子

    一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库   #在当前目录新建一个build目录,然后cd build ...

随机推荐

  1. kinect:0x80080014

    changed to 0x83010014 aka E_NUI_NOTCONNECTED? kinect识别问题,重启一下,就可以了.

  2. Virtualbox guest in KDE Neon

    在最新版的KDE Neon里面装VirtualBox客户端工具,折腾了好久,时间紧的时候不得已用共享U盘的方法将就. 之前要么装完关机按钮点了没反应,要么重启进桌面后任务栏消失,再就是进去之后复制东西 ...

  3. 页面footer在底部

    页脚动态贴在底部需要满足以下两个条件: 当主体的内容高度不超过可视区域高度的时候,页脚贴在页面底部. 当主体的内容高度超过可视区域高度的时候,页脚将按正常布局. 方法一:footer高度固定+绝对定位 ...

  4. 04--C语言文件操作函数大全(超详细)

    fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const cha ...

  5. SpringBoot事务注解详解

    @Transactional spring 事务注解 1.简单开启事务管理 @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:ann ...

  6. Day 08 字符编码

    字符编码 计算机基础 启动应用程序 1.双击QQ 2.操作系统接受指定然后把该操作转化为0和1发送给CPU 3.CPU接受指令然后把指令发给内存 4.内存接受指令把指令发送给硬盘获取数据 5.QQ在内 ...

  7. 沃通SSL证书、代码签名证书应用于机器人安全防护

    近两年,扫地机器人.智能音箱等消费级机器人产品逐渐走入大众生活的中.随着人工智能技术的迅猛发展,预计2023年全球消费级机器人市场规模将达到150亿美元.然而,产业的迅猛发展却伴随着安全防护的缺失,安 ...

  8. 编译qemu

    el7上编译 git clone git://git.qemu-project.org/qemu.git ./configure --target-list=x86_64-softmmu --cpu= ...

  9. 数据结构(5) 第五天 快速排序、归并排序、堆排序、高级数据结构介绍:平衡二叉树、红黑树、B/B+树

    01 上次课程回顾 希尔排序 又叫减少增量排序 increasement = increasement / 3 + 1 02 快速排序思想 思想: 分治法 + 挖坑填数 分治法: 大问题分解成各个小问 ...

  10. express get和post方法

    把之前学习的一个小例子贴出来: 前提:需安装nodejs,可以在终端中输入node -v检查是否安装成功,安装成功后才可执行下面的步骤. 1.新建一个名称为“node”文件夹   2.进入node目录 ...