1、创建一个Node类用来实现对键值对的连表式存储
package com.wyz.JAVA0512.HashMapTest;
public class Node {
// 节点
Object key;
Object value;
Node next;
public Node() {
}
public Node(Object key, Object value) {
this.key = key;
this.value = value;
}
}
2、创建MyHashMap用来简单的实现对键值对的存和取。
package com.wyz.JAVA0512.HashMapTest;
public class Bucket {
Node[] nodes = new Node[16];
int size = 0;// 位桶的个数
int length = 0;// 链表的长度。
// 定义一个自己对桶位数量散列后的hashcode值
private int myHash(Object key, int length) {
int h = key.hashCode() & (length - 1);
return h;
}
// 将数据存到HashMap桶中,
public void put(Object key, Object value) {
// map的数据的增加。
Node tmp = new Node(key, value);
int a = myHash(key, nodes.length);
// System.out.println(a);
for (int i = 1; i < nodes.length; i++) {
}
// 如果是首次创建的话,直接放到桶位中
if (nodes[a] == null) {
nodes[a] = tmp;
size++;// 位桶的个数
} else {
// 如果不是首次创建的话就要在桶位后面加链表了需要遍历链表,将tmp添加进去。
// 需要遍历链表
Node p = new Node();
p = nodes[a];
for (int i = 0; i < nodes.length; i++) {
// 利用指针移动,判断最后一个节点,将获取的数据房到最后一个节点的后面。
if (p.next == null) {
p.next = tmp;
length++;// 链表的长度。
// System.out.println(p.next.value);
break;
} else {
p = p.next;
}
}
}
}
// 根据key的值获取value的值。
public Object[] get(Object key) {
// 确定桶位
int a = myHash(key, nodes.length);
// System.out.println(a);
// 增加数组变量,接收查询数据结果。
Object[] tmp = new Object[nodes.length];
// 判断桶位是否为空
if (nodes[a] == null) {
return null;
} else {
// 如果桶位不为空,则需要开始遍历链表,增加用于遍历的指针。
Node pNode = new Node();
// 将指针指向桶位。
pNode = nodes[a];
// 循环遍历
int tsize = 0;
for (int i = 0; i < nodes.length; i++) {
// 如果key的值相等,则输出对应的key的value值。
if (pNode.key.equals(key)) {
// 将key相等的键值对的value值保存到数组中。
tmp[tsize++] = pNode.value;
// 判断下一个节点是否为空不为空就移动指针,为空则退出循环。
if (pNode.next != null) {
pNode = pNode.next;
} else {
break;
}
} else {
// key不相等的话就继续遍历下一个节点
// 如果存在下一个节点就将指针移动到下一个节点。
if (pNode.next != null) {
// 如果不存在下一个节点就退出循环。
pNode = pNode.next;
} else {
break;
}
}
}
return tmp;
}
}
// 重写toString 方法实现键值对的查看
@Override
// 重写toString方法
public String toString() {
// 实现{123:小刘,103:小王}
StringBuilder sb = new StringBuilder("{");
// 遍历桶位
// 创建指针以便遍历
Node p = new Node();
for (int i = 0; i < nodes.length; i++) {
p = nodes[i];
// 遍历链表
while (p != null) {
sb.append(i + "(" + p.key + ":" + p.value + "),\n");
p = p.next;
}
}
sb.setCharAt(sb.length() - 1, '}');
return sb.toString();
}
// 代码测试。
public static void main(String[] args) {
Bucket b = new Bucket();
b.put("123", "小刘");
b.put("153", "小王");
b.put("133", "小张");
b.put("123", "小赵");
b.put("153", "小李");
b.put(222, "小郑");
b.put(333, "小周");
// 根据key的值获取对应的value的值
Object[] temp = new Object[b.length];
// System.out.println();
temp = b.get("133");
// System.out.println();
// System.out.println(b.myHash("153", 15));
for (int i = 0; i < b.length; i++) {
if (temp[i] != null) {
System.out.println(temp[i]);
}
}
System.out.println("****分割线***");
// 遍历查看hashmap中的数据
System.out.println(b.toString());
}
}