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;//下一个节点 }

最新文章

  1. iOS 实例变量修饰符
  2. web服务器选择Apache还是Nginx
  3. centos7.0改变用户创建目录组权限
  4. 在caffe中添加新的layer
  5. jquery easyui datebox单击文本框显示日期选择
  6. 区别Javascript中的Null与Undefined
  7. bzoj2792
  8. 48种CIFilter
  9. ios 动态设置Cell高低
  10. 如何从Terminal Command Line编译并运行Scope
  11. [css 实践篇] CSS box-orient
  12. java读取文件乱码
  13. 前端开发面试题总结之——JAVASCRIPT(三)
  14. 【转载】“宇宙最强” IDE,Visual Studio 2019 正式发布
  15. 【Unity】4.6 灯光
  16. Win10玩游戏时听歌音量忽大忽小
  17. bzoj1864 三色二叉树
  18. Android—— TextView文字链接4中方法
  19. R中的各种概率统计分布
  20. 用MCI处置WAV视频时,怎样才能让视频在当前窗口播放

热门文章

  1. WP - 控件基础-按钮控件
  2. Linux强行踢用户
  3. 【技术累积】【点】【java】【9】Optional
  4. ZBrush快捷键与鼠标操作
  5. JS 输入年份,再输入月份,弹出这个月有多少天?
  6. 路飞学城Python-Day186
  7. mysql数据库重点监控
  8. Mysql5.7安装过程----win10
  9. ubuntu17.04中启动tnsorboard过程
  10. VS2015使用C++编写DLL,并在C#环境中调用【转】