面试的时候可能会要你手写一个hashmap,这里提供个简易版本,亲测有效。
下面是接口。
package com.test.common;
public interface DemoMap<K,V> {
V get(K k);
void set(K k,V v);
interface DemoEntity<K,V>{
K getKey();
V getValue();
String getHash();
DemoEntity getNext();
}
}
下面是实现
package com.test.common.impl;
import com.test.common.DemoMap;
import java.util.Objects;
public class DemoMapImpl<K, V> implements DemoMap<K, V> {
private MyEntity<K, V>[] list;
private int length=16;
public DemoMapImpl(int length) {
if(!Objects.isNull(length)){
this.length=length;
}
list = new MyEntity[length];
}
@Override
public void set(K k, V v) {
MyEntity myEntity = setNode(k,v);
int index=getIndex(k);
list[index] = myEntity;
}
private int getIndex(K k){
return (length-1)&hash(k);
}
private MyEntity setNode(K k,V v){
MyEntity myEntity=new MyEntity<>(k,v);
return myEntity;
}
@Override
public V get(K k) {
return getNode(k).getValue();
}
MyEntity<K, V> getNode(K k) {
return list[getIndex(k)];
}
private int hash(K key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
class MyEntity<K, V> implements com.test.common.DemoMap.DemoEntity<K, V> {
private K key;
private V value;
private String hash;
private MyEntity next;
MyEntity(K k,V v){
this.key=k;
this.value=v;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public String getHash() {
return null;
}
@Override
public DemoEntity getNext() {
return null;
}
}
}
下面是使用:
DemoMapImpl<String,Integer> demoMap=new DemoMapImpl<String,Integer>(16);
demoMap.set("ddd",1212);
demoMap.set("ooo",13131);
System.out.println(demoMap.get("ddd"));