理解HashMap底层原理,一个简单的HashMap例子
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例子的更多相关文章
- 最简单的HashMap底层原理介绍
HashMap 底层原理 1.HashMap底层概述 2.JDK1.7实现方式 3.JDK1.8实现方式 4.关键名词 5.相关问题 1.HashMap底层概述 在JDK1.7中HashMap采用的 ...
- HashMap底层原理
原文出自:http://zhangshixi.iteye.com/blog/672697 1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射 ...
- hashMap 底层原理+LinkedHashMap 底层原理+常见面试题
1.源码 java1.7 hashMap 底层实现是数组+链表 java1.8 对上面进行优化 数组+链表+红黑树 2.hashmap 是怎么保存数据的. 在hashmap 中有这样一个结构 ...
- HashMap底层原理分析(put、get方法)
1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- 一个简单的cmake例子
一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库 #在当前目录新建一个build目录,然后cd build ...
随机推荐
- String[]转化暴露“思维误区”
那天写code,用到这个,强转,将页面传来的值转换为数组,结果是,当页面传来的只有一个值时,它是无法转换为数组的,只能获得1个string,只有length>1时才会转化为数组的形式,报的错误是 ...
- jquery mobile datepicker
1.http://jquerymobile.com/demos/1.0a4.1/experiments/ui-datepicker/ 这个只能用在iOS和PC上,使用<input date,An ...
- go基础笔记
1.slice:作为参数传递时,传递的是地址,当append时,在新的内存地址分配数据,但是没有返回给原的slice,只能通过返回值的方式赋值给slice2.func(a []int):传递,可以3. ...
- (转) RabbitMQ学习之spring整合发送异步消息
http://blog.csdn.net/zhu_tianwei/article/details/40919031 实现使用Exchange类型为DirectExchange. routingkey的 ...
- C#的split函数分割
C#的split函数分割 string str = textBox1.Text; string[] strlist = str.Split("\r\n".ToCharArray() ...
- Linux终端 Tab 补全命令
1. vi编辑器打开 /etc/bash.bashrc文件 vi /etc/bash.bashrc 2.找到文件中的下列代码 3.将注释符号#去掉,即改成 4.最后 source一下 /etc/bas ...
- MongoDB_"Error parsing YAML config file: yaml-cpp: error at line 3, column 9: illegal map value"解决方法
在启动配置文件的时候,系统报错:Error parsing YAML config file: yaml-cpp: error at line 3, column 9: illegal map val ...
- 初级模拟电路:1-2 PN结与二极管
回到目录 1. 掺杂半导体 上面我们分析了本征半导体的导电情况,但由于本征半导体的导电能力很低,没什么太大用处.所以,一般我们会对本征半导体材料进行掺杂,即使只添加了千分之一的杂质,也足以改变半导 ...
- Module.exports 和 exports
Module.exports 和 exports 在node中,没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部,那么模块间如何通信 当加载一个模块的时候,被加载模块的代码在第一次 ...
- 深入了解Spring中的容器
1.创建Bean的3种方式 1.1使用构造器创建bean实例 这是最常见的方式,如果不采用构造注入,bean类需要有默认构造函数.如果采用构造注入,则需要配置xml文件的<constructor ...