题解
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)); }}