Map接口 -- HashMap底层原理

1、源码

Map接口 -- HashMap底层原理_第1张图片

Map接口 -- HashMap底层原理_第2张图片

 

2、图例表示

Map接口 -- HashMap底层原理_第3张图片

Map接口 -- HashMap底层原理_第4张图片

 

3、存储过程

Map接口 -- HashMap底层原理_第5张图片

4、取数据

Map接口 -- HashMap底层原理_第6张图片

4、测试hash算法

Map接口 -- HashMap底层原理_第7张图片

5、LeetCode 706 设计哈希映射 

https://leetcode-cn.com/problems/design-hashmap/

class MyHashMap {
		class Node{
			private int key;
			private int val;
			private Node next;
			public Node(int key,int val){
				this.key = key;
				this.val = val;
			}
		}
		
		private static final int N = 100011;
		Node[] table = null;

	    /** Initialize your data structure here. */
	    public MyHashMap() {
	    	this.table = new Node[N]; //初始化,数组中节点为Null
	    }
	    
	    /** value will always be non-negative. */
	    public void put(int key, int value) {
	    	Node cur = new Node(key,value);
	    	int idx = key % N;
	    	if(table[idx] == null){ //此处数组元素为空,则直接将新节点放进去
	    		table[idx] = cur;
	    	}else{ //此处数组元素不为空,则遍历数组下标所对应的链表
	    		Node tmp = table[idx];
	    		Node last = null;
	    		while(tmp != null){
	    			//1.键重复,则覆盖更新
	    			if(tmp.key == key){
	    				tmp.val = value;
	    				break;
	    			}else{ //2.键不存在不重复,则遍历下一个;
	    				last = tmp;
	    				tmp = tmp.next;
	    			}
	    		}
	    		//则插入到链表末尾
	    		if(tmp == null){
	    			last.next = cur;
	    		}
	    	}
	    }
	    
	    /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
	    public int get(int key) {
	    	int idx = key % N;
	    	if(table[idx] == null) return -1;
	    	
	    	Node tar = table[idx];
	    	while(tar != null){ //索引到数组中对应的下标位置
	    		if(tar.key == key){
	    			return tar.val;
	    		}
	    		tar = tar.next; //继续对数组中对应的下标位置 的链表进行索引链表
	    	}
			return -1;
	    }
	    
	    /** Removes the mapping of the specified value key if this map contains a mapping for the key */
	    public void remove(int key) {
	    	int idx = key % N;
            if (table[idx] == null) return;

	    	if(table[idx] != null){ //索引到数组中对应的下标位置
	    		Node tar = table[idx];
                if(tar.key == key){
                    table[idx] = tar.next;
                    return;
                }
	    		//继续对数组中对应的下标位置 的链表进行索引链表
	    		Node pre = null;
	    		Node after = null;
	    		while(tar.key != key){
	    			pre = tar;
	    			tar = tar.next;
	    		}
	    		//退出循环时,此时的tar正是目标节点
	    		after = tar.next;
	    		pre.next = after;
	    	}
	    }
	}

Map接口 -- HashMap底层原理_第8张图片

你可能感兴趣的:(数据结构)