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. fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能

    用vue写的 显示,隐藏 hide(){ this.canvas.getActiveObject().set('opacity', 0).setCoords(); this.canvas.reques ...

  2. IAAS: IT公司去IOE-Alibaba系统构架解读

    从Hadoop到自主研发,技术解读阿里去IOE后的系统架构 原地址:...................... 云计算阿里飞天 摘要:从IOE时代,到Hadoop与飞天并行,再到飞天单集群5000节 ...

  3. 关于maven-基本

    笔记 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object ...

  4. HTML 引入 CSS、JS 的三种方式

    描述部分按 CSS 来的,其实 JavaScript 也一样,具体区别看代码 外部样式表 当样式需要被应用到很多页面的时候,外部样式表将是理想的选择.使用外部样式表,你就可以通过更改一个文件来改变整个 ...

  5. 基于Nginx服务的用户认证

    通过Nginx实现web页面的用户认证,用户名为:admin,密码为:654321 1.修改Nginx配置文件 # vim /usr/local/nginx/conf/nginx.conf ..... ...

  6. Spring cloud父项目的建立

    1.建立一个maven项目 注意建立项目的时候.选择pom的包 2.添加架包 <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...

  7. win7/win10 未分配磁盘怎样创建扩展分区 也就是逻辑分区(转截)

    我们有时候用windows7的磁盘管理工具对windows7系统分区管理的时候,我们可能会不小心把我们的电脑硬盘扩展分区都删除了,扩展分区变为了未分配的空间,这时候如果我们新建分区的话,建立的都是主分 ...

  8. 推荐一款能支持国密SM2浏览器——密信浏览器

    密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...

  9. 解决value toDF is not a member of org.apache.spark.rdd.RDD (spark2.1 )

    解决上述办法有两点: 1.两个import 需要放在 hiveCtx之后. val hiveCtx: SparkSession = SparkSession.builder.config(conf). ...

  10. Python全双工聊天

    全双工聊天 全双工聊天:服务端和客户端都可以发送并接收信息. 使用select模块中的select方法 select(rlist, wlist, xlist[, timeout]) -> (rl ...