一、自定义Map接口
public interface Map<K,V> {
V set(K k,V v);
V get(K k);
int size();
void remove(K k);
}
二、自定义HashMap实现类
package com.summer.customer;
public class HashMap<K, V> implements Map<K, V> {
private static final int DEFAULT_MAX_SIZE = 16;
Entry[] entrySet = new Entry[DEFAULT_MAX_SIZE];
private int size = 0;
@Override
public V set(K k, V v) {
int index = hash(k);
Entry entry = entrySet[index];
if (entry == null) {
entrySet[index] = new Entry(k, v, null);
size++;
} else {
entrySet[index] = new Entry(k, v, entry);
}
return v;
}
@Override
public V get(K k) {
int index = hash(k);
Entry entry = entrySet[index];
if (entry == null)
return null;
if (entry.getK().equals(k)) {
return (V) entry.getV();
} else {
if (entry.getNext() != null) {
return (V) getEntry(k, entry.getNext()).getV();
} else {
return null;
}
}
}
private Entry getEntry(K k, Entry entry) {
if (entry.getK().equals(k)) {
return entry;
} else {
getEntry(k, entry.getNext());
}
return null;
}
@Override
public int size() {
return size;
}
@Override
public void remove(K k) {
int index = hash(k);
Entry entry = entrySet[index];
if (entry == null) {
return;
} else {
if (entry.getK().equals(k)) {
entrySet[index] = null;
} else {
removeEntry(k, entry.getNext());
}
size--;
}
}
private void removeEntry(K k, Entry entry) {
if (k.equals(entry.getK())) {
entry = null;
} else {
removeEntry(k, entry.getNext());
}
}
/**
* <p>通过hash算法,计算出key的下标位置
*
* @param k
* @return int
*/
private int hash(K k) {
int hashCode = k.hashCode();
int mod = hashCode % DEFAULT_MAX_SIZE;
return mod >= 0 ? mod : Math.abs(mod);
}
}
class Entry<K, V> {
private K k;
private V v;
private Entry<K, V> next;
public Entry(K k, V v, Entry<K, V> next) {
this.k = k;
this.v = v;
this.next = next;
}
public K getK() {
return k;
}
public void setK(K k) {
this.k = k;
}
public V getV() {
return v;
}
public void setV(V v) {
this.v = v;
}
public Entry<K, V> getNext() {
return next;
}
public void setNext(Entry<K, V> next) {
this.next = next;
}
}
三、测试
public class HashMapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.set("Aa", "allen");
map.set("BB", "tom");
map.set("ABCDEa123abc", "jone");
map.set("ABCDFB123abc", "bob");
map.set("dick", "dick");
map.remove("jone");
// hash冲突测试
System.out.println("Aa".hashCode() == "BB".hashCode());
System.out.println("ABCDEa123abc".hashCode() == "ABCDFB123abc".hashCode());
System.out.println(map.get("Aa") + "-" + map.get("BB") + "-" + map.get("ABCDEa123abc") + "-"
+ map.get("ABCDFB123abc") + "-" + map.get("dick"));
System.out.println(map.size());
}
}