自己实现HashMap(java)

本文记录了作者花费一个多小时实现HashMap的过程,通过添加Iterable接口实现迭代,并探讨了HashMap的内部实现原理,即利用对象的HashCode唯一性,将键值对存储在LinkedList数组中。作者还计划对当前实现进行优化,以提高代码的可读性和效率。
摘要由CSDN通过智能技术生成
package MyHashmap;

import java.util.Arrays;
import java.util.Iterator;

/**
 * 自己写的hashmap,加深理解!~
 */
public class Hashmap2 {
	private Entry table[] = new Entry[3];
	private int size = 0;

	private class Entry implements Iterable {// hashmap的链表
		int size = 0;
		Node firstNode;

		class Node {// 链表的节点类
			@Override
			public String toString() {
				return " [key=" + key + ", value=" + value + "]";
			}

			Object key;
			Object value;
			Node nextNode;

			public Node(Object key, Object value, Node node) {// 节点类构造
				super();
				this.key = key;
				this.value = value;
				this.nextNode = node;
			}
		}

		void add(Object key, Object value) {// 链表的add
			if (size == 0) {
				firstNode = new Node(key, value, null);
				size++;
				return;
			}
			firstNode = new Node(key, value, firstNode);
			size++;
		}

		void remove(Object key) {//链表的删除
			Iterator ite = this.iterator();
			while (ite.hasNext()) {
				Node thisNode = (Node) ite.next();
				if (thisNode.key.equals(key)) {
					ite.remove();
					size--;
					return;
				}
			}
		}

		Object getValueByKey(Object key) {//通过key取value
			Iterator ite = this.iterator();
			while (ite.hasNext()) {
				Node thisNode = (Node) ite.next();
				if (thisNode.key.equals(key)) {
					return (Object) (thisNode.value);
				}
			}
			return null;
		}

		private class iter implements Iterator {//实现迭代器
			Node currentNode;
			Node previousNode;
			Node prepreviousNode;

			iter() {
				currentNode = firstNode;
				previousNode = null;
			}

			@Override
			public boolean hasNext() {
				return currentNode != null;
			}

			@Override
			public Object next() {
				prepreviousNode = previousNode;
				previousNode = currentNode;
				currentNode = currentNode.nextNode;
				return previousNode;
			}

			public void remove() {
				if(size==1) {
					firstNode=null;
				}else if(size==2) {
					firstNode=firstNode.nextNode;
				}else	if (size > 2) {
					prepreviousNode.nextNode = currentNode;
					previousNode = prepreviousNode;
					prepreviousNode = null;
				}
				
			}

		}

		@Override
		public Iterator iterator() {
			return new iter();
		}

		@Override
		public String toString() {
			if (size == 0) {
				return " , ";
			}
			StringBuilder sb = new StringBuilder("[");
			Iterator ite = iterator();
			while (ite.hasNext()) {
				sb.append(ite.next());
			}
			sb.append("]");
			return sb.toString();
		}

	}

	public void add(Object key, Object value) {//map的add方法
		int hash = key.hashCode() % table.length;
		if (table[hash] == null) {
			table[hash] = new Entry();
		}
		Iterator ite = table[hash].iterator();
		while (ite.hasNext()) {
			Object nodeKey = ite.next();
			if (((Hashmap2.Entry.Node) nodeKey).key.equals(key)) {
				return;
			}
		}
		table[hash].add(key, value);
	}

	public void remove(Object key) {//map的remove方法
		int hash = key.hashCode() % table.length;
		if (table[hash] == null) {
			return;
		}
		Iterator ite = table[hash].iterator();
		while (ite.hasNext()) {
			Object nodeKey = ite.next();
			if (((Hashmap2.Entry.Node) nodeKey).key.equals(key)) {
				table[hash].remove(key);
				return;
			}
		}
	}

	public Object getByKey(Object key) {//map通过key返回value
		int hash = key.hashCode() % table.length;
		if (table[hash] == null) {
			return null;
		}
		return table[hash].getValueByKey(key);
	}

	@Override
	public String toString() {
		return Arrays.toString(table);
	}
}

花了一个多小时才把HashMap实现,比之前实现的集合多添加了iterable接口来实现迭代.对于代码还是很不熟悉,感觉我还是需要多多练习~!~


HashMap的实现原理是实现了一个LinkedList数组.   维护了一个HashTable, 原理是利用每个对象的HashCode唯一性.

然后使用key的hashcode取余数组长度,得到下标.....然后把key,value存入table[hash]位置的链表中.


2018.6.29....感觉这个hashmap还可以优化一下,我前面的实现方式相当于是 LinkedList table[]=new LinkedList [1000];这种粗暴的方式....既不直观也不好读写....有空来优化一下....entry内部类直接保存key和value和nextEntry指针.....这样子感觉比较好...


第一次手写长度到达170行的代码....感觉手都累了....加油....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值