手写HashMap

手写HashMap

/**
 * 自定义HashMap
 * v01基本要素加put isEmpty方法
 * v02增加size get toString remove方法。
 * v03增加泛型
 * @author ad
 *
 */
public class MyHashMap<K, V> {
	private Node<K,V>[] table;//位桶数组
	private int size;
	private static final int DEFALT_CAPACITY = 16;	//默认长度
	
	public MyHashMap() {
		table = new Node[DEFALT_CAPACITY];//2的整次幂
	}
	
	public void put(K key, V value) {
		int hash = hash(key);
		Node<K, V> newNode = new Node<K, V>(null, key, value, hash);//新建节点,next为空
		if (null == table[hash]) {	//如果是数组中该位置下的第一个元素,即为链表的头节点
			table[hash] = newNode;
		}else {
			Node<K, V> oldNode = table[hash];//存放旧节点
			while(oldNode.next != null) {//检测key是否在链表中存在
				if (oldNode.key.equals(key)) {
					oldNode.value = value;	//key已经存在,用新的value覆盖
					return;
				}
				oldNode = oldNode.next;
			}
			oldNode.next = newNode;//遍历链表后不存在key,将新节点存放于链表最后
		}
		size++;
	}
	//get方法
	public V get(K key) {
		int hash = hash(key);
		Node<K, V> findNode = table[hash];//存放旧节点
		while(findNode != null) {//检测key是否在链表中存在
			if (findNode.key.equals(key)) {
				return findNode.value;
			}
			findNode = findNode.next;
		}
		return null;
	}

	
	//删除键值对
	public V remove(K key) {
		int hash = hash(key);
		Node<K, V> node = table[hash];//存放当前节点
		Node<K, V> prevNode = null;//存放前一个节点
		while (null != node) {
			if (node.key.equals(key)) {//找到要删除的节点
				size--;
				if (null == prevNode) {//删除头节点
					table[hash] = node.next;//重置数组中的节点
					return node.value;
				}else {					//其他节点
					prevNode.next = node.next;
					return node.value;
				}
			}
			prevNode = node;
			node = node.next;
		}
		return null;
	}
	
	public boolean isEmpty() {
		if (size <= 0) {
			return true;
		}
		return false;
	}
	

	
	private int size() {
		return size;
	}
	
	@Override
	public String toString() {	//遍历数组及链表
		if (isEmpty()) {
			return "{}";
		}
		StringBuilder sb = new StringBuilder("{");
		for (int i = 0; i < table.length; i++) {
			Node<K, V> tempNode = table[i];
			while (null != tempNode) {
				sb.append(tempNode.key + "=" + tempNode.value + ", ");
				tempNode = tempNode.next;
			}
		}
		sb.replace(sb.length() - 2, sb.length(), "");
		sb.append("}");
		return sb.toString();
	}
	
	//计算hash值,采用hashcode&(length-1)
	private int hash(K key) {
		return (null == key) ? 0 : key.hashCode()&(table.length - 1);
	}
	
	/**
	 * 内部类,节点类
	 * @author ad
	 *
	 */
	static private class Node<K, V>{
		Node<K, V> next;	//下一个节点
		K key;	//键
		V value;	//值
		int hash;	//hash值
		public Node(Node<K, V> next, K key, V value, int hash) {
			this.next = next;
			this.key = key;
			this.value = value;
			this.hash = hash;
		}	
	}
	
	public static void main(String[] args) {
		MyHashMap<String, String> map = new MyHashMap<>();
		
		for (int i = 0; i < 40; i++) {
			map.put(i + "",  i + "---");
		}
		System.out.println(map.get("39"));
		//System.out.println(map.remove(null));
		System.out.println(map);
	}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值