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. C# 获得指定路径扩展名 , 去除扩展名

    //指定扩展名的文件 private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; st ...

  2. B/S架构的网站测试

      一.功能测试 1.链接测试 链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段.链接测试可分为三个方面.首先,测试所有链接是否按指示的那样确实链接到了 ...

  3. Camera三维动画

    一.概述 在Android中说到3D开发,我们首先想到的是OpenGL,但用起来比较复杂繁琐,不适合做应用级别的3D变换.Android为我们提供了一个简化版的3D开发入口:Camera(这里的Cam ...

  4. 序列模型(5)-----双向神经网络(BRNN)和深层循环神经网络(Deep RNN)

    一.双向循环神经网络BRNN 采用BRNN原因: 双向RNN,即可以从过去的时间点获取记忆,又可以从未来的时间点获取信息.为什么要获取未来的信息呢? 判断下面句子中Teddy是否是人名,如果只从前面两 ...

  5. 利用Selenium实现图片文件上传的两种方式介绍

    在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...

  6. selenium+java启动chrome浏览器

  7. bat执行bat文件

    目的:在服务器桌面创建一个bat文件执行tomcat下的startup.bat文件,这样就不用每次都去文件夹下找startup.bat文件 桌面bat文件内容: @echo off start D:\ ...

  8. rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld

    首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...

  9. iis配置问题报错 -- Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies

    具体提示: Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. 试图加载格式不正确的程序. ...

  10. java书籍推荐:《Java SE 6 技術手册》

    Java SE 6 技術手册 或  Java SE 6 技術手册 Java SE 6 技術手册 為什麼選擇用 Markdown?仅仅是單純把文件又一次排版太無聊了,不如趁這個機會學些新東西.所以我就藉 ...