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行的代码....感觉手都累了....加油....