一、自定义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;@Overridepublic 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;}@Overridepublic 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;}@Overridepublic int size() {return size;}@Overridepublic 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());}}