HashMap底层实现原理:数组+链表+红黑树(JDK8版本之后)
1.创建Map接口:
public interface Map<K,V> {
public V put(K k,V v);
public V get(K k);
public int size();
interface Entry<K,V>{
public K getKey();
public V getValue();
}
}
2.创建HashMap实现Map接口:
public class HashMap<K,V> implements Map<K,V> {
private Entry<K,V>[] table = null;
private int size=0;
private static int defaultLength = 16;
public HashMap(){
table = new Entry[defaultLength];
}
@Override
public V put(K k, V v) {
//通过hash把key算出来
int index = hash(k);
Entry<K,V> entry = table[index];
if (entry == null){
table[index] = new Entry<>(k,v,index,null);
size++;
}else {
table[index] = new Entry<>(k,v,index,entry);
}
return table[index].getValue();
}
@Override
public V get(K k) {
if (size == 0){
return null;
}
int index = hash(k);
Entry<K,V> entry = getEntry(k, index);
return entry == null?null:entry.getValue();
}
private Entry<K,V> getEntry(K k, int index) {
for (Entry<K,V> e = table[index]; e!=null; e=e.next){
if (e.hash == index && (k==e.getKey() || k.equals(e.getKey()))){
return e;
}
}
return null;
}
@Override
public int size() {
return size;
}
private int hash(K k){
return Math.abs(k.hashCode()%defaultLength-1);
}
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 index, Entry<K,V> o) {
this.k=k;
this.v=v;
this.hash=index;
next=o;
}
@Override
public K getKey() {
return k;
}
@Override
public V getValue() {
return v;
}
}
}