采用jdk1.7数组加单链表方式实现
Map接口
public interface Map<K,V> {
V put(K k,V v);
V get(K k);
int size();
interface Entry<K,V>{
K getKey();
V getValue();
}
}
HashMap实现类
public class HashMap<K,V> implements Map<K,V> {
private Entry<K,V>[] table=null;
int size=0;
public HashMap() {
this.table=new Entry[16];
}
/*
* 通过key用hash算法算出hash值取模
*找到数组index下标,找到当前下表对象
*判断当前对象是否为空,如果为空,直接存储
*如果不为空,冲突,就要用到链表
* 返回当前的节点对象
* */
@Override
public V put(K k, V v) {
int index = hash(k);
Entry<K, V> entry = table[index];
if (null==entry){
table[index] = new Entry<>(k, v, index, null);//原来元素为空,直接赋值
size++;
}else{
table[index] = new Entry<>(k, v, index, entry);//原来元素不为空,占据原来元素的位置next指向原来元素的位置
}
return table[index].getValue();
}
private int hash(K k){
int index=k.hashCode()%16;
return index>=0?index:-index;
}
/*
* 通过key算出hash值得到index下表数组对象
* 判断对象是否为空,如果不为空进行判断是否相等
* 如果对象不相等,再判断next是否为空,如果不为空,判断与next相不相等,直到相等或者为空
* 返回对象的value值
*
* */
@Override
public V get(K k) {
if(size==0){
return null;
}
int index=hash(k);
Entry<K, V> entry = findValue(table[index],k);
return entry==null?null:entry.getValue();
}
//以递归形式从一个entry链表中找到k对应的对象
private Entry<K,V> findValue(Entry<K,V> entry, K k) {
if (k.equals(entry.getKey())||k==entry.getKey()){
return entry;
}else {
if(entry.next!=null){
return findValue(entry.next,k);
}
}
return null;
}
@Override
public int size() {
return size;
}
class Entry<K,V> implements Map.Entry<K,V>{
K k;V v;int hash;Entry<K,V> next;
public Entry(K k, V v, int hash, Entry<K, V> next) {
this.k = k;
this.v = v;
this.hash = hash;
this.next = next;
}
@Override
public K getKey() {
return k;
}
@Override
public V getValue() {
return v;
}
}
}
Test测试类
public class Test {
public static void main(String[] args) {
Map<Object, Object> map = new HashMap<>();
map.put("xjy","xjy");
map.put("yxy","yxy");
System.out.println(map.get("xjy"));
System.out.println(map.size());
}
}