您的位置:首页 > 其它

自己手动实现HashMap底层

2017-04-06 21:59 357 查看

手动实现HashMap底层代码

要注意的是:

HashMap的底层存储,使用的是数组存储

数组中的每个元素是链表的地址

通过链表的地址找到所有Hash值相同元素

package com.ahut.map;

import java.util.LinkedList;

/**
* 自己手动实现Map的底层,Map的底层实现
* 是由许多链表构成的数组,数组中的元素是链表的
* 开始节点,通过该节点能找到所有Hash值相同的元素
*/
public class MyHashMap {
LinkedList[] arr = new LinkedList[999];//链表数组
int size;

//1.构造方法
public MyHashMap(){}

//2.向Map中添加元素
public void put(Object key, Object value) {
Node n = new Node(key, value);
int hash = n.hashCode() % arr.length;
hash = hash<0 ? -hash : hash;
if(arr[hash] == null) {//如果该位置链表为空
LinkedList list = new LinkedList();
arr[hash] = list;
list.add(n);//将要放入的节点n作为第一个节点放入
} else {//如果这个位置已经有链表了
LinkedList list = arr[hash];//取出该处的链表
//判断有没有键值key重复
for(int i=0; i<list.size(); i++) {
Node temp = (Node) list.get(i);
if(temp.key.equals(key)) {//如果该节点存在,覆盖掉
temp.value = value;
}
}
arr[hash].add(n);
}
}

//3.从Map中,用键去取数据
public Object get(Object key) {
int hash = key.hashCode() % arr.length;
hash = hash<0 ? -hash : hash;
if(arr[hash] != null) {
LinkedList list = arr[hash];
for(int i=0; i<list.size(); i++) {
Node temp = (Node) list.get(i);
if(temp.key.equals(key)) {
return temp.value;
}
}
}

return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hashmap 链表