JAVA_HashMap自己做个初步的存储,

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());
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值