最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天速递!手撕HashMap(二)

来源:博客园


(资料图片)

  • 这里再补充几个手撕HashMap的方法

1、remove()

  1. remove 方法参数值应该是键值对的键的值,当传入键值对的键的时候,remove 方法会删除对应的键值对
  2. 需要利用我们自己先前创建的 hashcodeList 来实现,hashcodeList 存入了所有被使用的 hashcode 值,方便后续的操作
  3. 在 put() 中,当添加新的键值对时,就会调用hashcodeList.add(hashcode);来存入添加的 hashcode 值
  4. hashcodeList:
/**     * 不需要遍历数组,大大减少了代码量,直接存入hashcode的值     * 用来记录被使用的hashcode,方便后续其他方法的操作     */    List hashcodeList = new ArrayList<>();
  1. remove() 方法的思路:
    • 根据传入的 key 的值,遍历 hashmap
    • 当 key 的值相同时,删除它,与此同时遍历 hashcodeList
    • 当 hashcodeList 中存储的哈希值与 key 通过 hashcode(key) 方法后得到的哈希值相等时,删除这个 hashcodeList 值
  2. 代码:
/**     * 删除传入的key值所对应的键值对对象     *     * @param key 传入的key     */    @Override    public void remove(K key) {        int hashcode = hashcode(key);        for (Entry entry : mapArr[hashcode]        ) {            //要把hashcodeList中的hashcode删除            hashcodeList.removeIf(integer -> hashcode(entry.getKey()) == integer);            //删除 mapArr             if (entry.getKey().equals(key)) {                mapArr[hashcode].remove();            }        }    }

关键词: