自己动手写HashMap

时间:2023-01-13 09:03:45

  HashMap是结合队列和链表各自的优点,创造的一种在查询和修改间取得性能平衡的一种集合!

 

MyMap接口:

package self;

//接口
public interface MyMap {

public void put(Object key, Object value);

public Object get(Object key);

}

 

此处只实现了最常用的get和put方法。

 

HashMap实现:

package self;

//接口实现类
public class MyHashMap implements MyMap {

private Node[] table;// 存放map数组

private int initSize;// map默认初始大小;

public MyHashMap(int initSize) {
this.initSize = initSize;
this.table = new Node[initSize];// 创建对象时初始化大小
}

@Override
public Object get(Object key) {

int i = this.indexOf(key);

Node node
= this.table[i];

Object compareKey
= node.getKey();

while (!key.equals(compareKey)) {
node
= node.nextNode;

if (node == null) {
break;
}
else {
compareKey
= node.getKey();
}
}

if (node != null) {
return node.getValue();
}

return null;
}

@Override
public void put(Object key, Object value) {

int i = this.indexOf(key);

Node thisNode
= new Node(key, value);

if (table[i] != null) {
Node node
= table[i];
Node next
= node.nextNode;// node 关联的下一个node

for (; next != null;) {
node
= next;
next
= node.nextNode;
}

node.setNextNode(thisNode);

}
else {
table[i]
= thisNode;
}

}

// 计算下标位置
private int indexOf(Object key) {

if (key != null) {
return key.hashCode() % this.initSize;// hascode值除map大小取余
}

return 0;
}

// 内部类:map节点
private class Node {
private Object key;
private Object value;
private Node nextNode;// 指向的下一个节点

public Node(Object key, Object value) {
this.key = key;
this.value = value;
}

public Object getKey() {
return key;
}

public Object getValue() {
return value;
}

public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
}

}

}

 

  1、采用最简单的: hash /  length 取余的方式去计算应存放的下标;(仅测试,实际java源码中的计算方式复杂的多)

  2、数组中存放的为Node对象,node.nextNode属性指向下一个对象;(同下标的数据通过此链表指向关联)

 

 

测试类:

package self;

import java.util.Date;

public class Test {

public static void main(String[] args) {

MyHashMap hashMap
= new MyHashMap(3);

hashMap.put(
"1", "111");
hashMap.put(
"2", "222");
hashMap.put(
3, 333);
hashMap.put(
"4", "444");
hashMap.put(
"a", "aaa");
hashMap.put(
"b", "bbb");
hashMap.put(
"c", "ccc");
hashMap.put(
"d", "ddd");

System.out.println(hashMap.get(
3));
}
}