package com.boot.test;
/**
* @param <K>
* @param <V>
*/
public interface YmmMapService<K, V> {
/**
* put value to arrays index key
* @param k key
* @param v value
* @return V value
*/
V put(K k, V v);
/**
* get value to arrays by index key
* @param k key
* @return V value
*/
V get(K k);
/**
* get hashCode by index key
* @param k key
* @return V value
*/
int ymmHashCode(K k);
}
上面是service;
下面是impl;
package com.boot.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class YmmMap<K,V> implements YmmMapService {
private final static Logger logger = LoggerFactory.getLogger(YmmMap.class);
/** 默认初始化16个Entry*/
int size = 16;
private YmmMap.Entry[] arrays;
public YmmMap(int size){
arrays = new YmmMap.Entry[size];
}
public YmmMap(){
arrays = new YmmMap.Entry[size];
}
@Override
public Object put(Object key, Object value) {
/* 先计算key的hashCode,然后将key,value放入hashCode对应的entry里,如果hash冲突, 则将
原来的entry放到链表后面,把对应的指针给新的entry*/
int hashCode = ymmHashCode(key);
int index = hashCode;
boolean exist = arrays[hashCode] == null;
//数组里该节点为空,则放入该位置
if (exist){
arrays[index] = new Entry(key,value,null);
}else {//否则将原来的entry放到链表后面,把对应的指针给新的entry
Entry<Object, Object> oldEntry = arrays[index];
arrays[index] = new Entry(key, value, oldEntry);
}
return value;
}
@Override
public Object get(Object key) {
int ymmHashCode = ymmHashCode(key);
/* 如果该下标数组无值,则返回null,否则比较key是否相同,相同返回value,不同找next,
继续比较是否相同,若无next节点,且key不同,则返回null*/
Entry entry = arrays[ymmHashCode];
if (entry == null){
return null;
}else {
entry = getNextEntryValue(entry, key);
if (entry == null){
return null;
}
}
return entry.v;
}
Entry getNextEntryValue(Entry entry, Object key){
if (key.equals(entry.getKey())){
return entry;
}else {
Entry next = entry.getNext();
if (next == null){
return null;
}else {
return getNextEntryValue(next, key);
}
}
}
@Override
public int ymmHashCode(Object key) {
int hashCode = key.hashCode();
int hash = hashCode % size;
logger.info("key:{},hashCode:{}, YmmHashCode:{}",key, hashCode, hash);
return hash;
}
private class Entry<K,V>{
K k;
V v;
Entry next;
int hashCode;
public Entry(K k, V v, Entry next){
this.k = k;
this.v = v;
this.next = next;
hashCode = getHashCode(k);
}
private int getHashCode(K k){
return k.hashCode();
};
@Override
public K getKey() {
return this.k;
}
@Override
public V getValue() {
return this.v;
}
@Override
public Entry getNext() {
return this.next;
}
}
}
-----------------------------------------------第一版,耗时28分钟----------------------------------------------
问题1、实现类不能用泛型做参数,报错have same erasure,balabala.....明天看看源码怎么实现的
问题2、只实现了数组加链表,链表又不是物理上的链表,要学习下链表底层原理,红黑树也并未用到,下周看看源码怎么实现的。
接下来的一周晚上继续改造,增加非空校验,泛型处理,以及hashMap底层实现原理。