题解
class MyHashMap {
// 桶的大小
private int hashKeySpace;
// 桶
private List<MyBucket<Integer, Integer>> hashTable;
public MyHashMap() {
// 初使化桶的大小
this.hashKeySpace = 2048;
// 初使化桶
this.hashTable = new ArrayList<>();
for (int i = 0; i < this.hashKeySpace; i++) {
this.hashTable.add(new MyBucket<>());
}
}
public void put(int key, int value) {
// 获取桶内的链表,操作链表
MyBucket bucket = getBucketByKey(key);
bucket.update(new MyEntry<Integer, Integer>(key, value));
}
public int get(int key) {
// 获取桶内的链表,再从链表中获取
MyBucket bucket = getBucketByKey(key);
MyEntry entry = bucket.get(key);
if (entry != null) {
return (int) entry.getValue();
}
return -1;
}
public void remove(int key) {
// 获取桶内的链表,再从链表中删除节点
MyBucket bucket = getBucketByKey(key);
bucket.remove(key);
}
/**
* 获取桶内的链表
* @param key
* @return
*/
private MyBucket getBucketByKey(int key) {
int hash = key % hashKeySpace;
return hashTable.get(hash);
}
}
// 节点结构
class MyEntry<K, V> {
final private K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
// 桶里面的链表结构
class MyBucket<K, V> {
// 链表
List<MyEntry<K, V>> linklist;
public MyBucket() {
linklist = new LinkedList<>();
}
/**
* 为 map 的 put 提供服务,有可能是新增节点,也有可能是更新节点
* @param entry 要放入链表的节点
*/
public void update(MyEntry<K, V> entry) {
// 标记是否是更新节点
boolean exists = false;
for (MyEntry<K, V> entryItem : linklist) {
// 根据 key 判断节点是否已存在,如果存在则更新
if (entry.getKey().equals(entryItem.getKey())) {
entryItem.setValue(entry.getValue());
exists = true;
}
}
// 如果 key 不存在,新增节点
if (!exists) linklist.add(entry);
}
/**
* 根据 key 获取节点
* @param key
* @return 如果不存在返回 null
*/
public MyEntry<K, V> get(int key) {
for (MyEntry<K, V> entry : linklist) {
if (entry.getKey().equals(key)) {
return entry;
}
}
return null;
}
/**
* 根据 key 删除节点
* @param key
*/
public void remove(int key) {
linklist.removeIf(entry -> entry.getKey().equals(key));
}
}