根据数组+链表的原理,自己实现一个简易版的HashMap

来源:互联网 发布:天苍苍野茫茫网络歌手 编辑:程序博客网 时间:2024/05/17 02:55

前言

昨天被人问到了HashMap底层实现方式,然而自己却只知道用hashCode()方法实现。虽然有看过HashMap源码,但自己却一直没搞懂具体实现方式。于是,从朋友那里借来一本书,专门研究了一下Map,才发现原来底层实现就是“数组 + 链表”的形式(顿时无语,当时自己居然没看出来!!)。

接上两篇“数组 + 链表”,本次还是尝试自己根据其原理来实现一个简易版的HashMap。

Map简介

  • Map底层实现原理
    • 数组 里面放 链表, 链表 里面放的Entry(key,value)。
  • 大致模型
    • 数组{链表1, 链表2, 链表3}
    • 链表1(Entry1<—>Entry2<—>Entry3)
    • Entry1(key, value)
  • 查找value的方式
    1. 先根据key的hashCode对容器size取余数,找到数组里面的链表对象
    2. 再遍历链表,根据key找到value(此时是用的key.equals()进行比较)

代码如下

import java.util.LinkedList;/** * 自己实现一个简易版的HashMap * * @author ALion * @version 2017/11/4 16:03 */public class MyHashMap<K, V> {    private LinkedList[] arr = new LinkedList[9999];    private int size;    public int size() {        return size;    }    /**     * 存入一个key-value对     */    public void put(K key, V value) {        MyEntry<K, V> entry = new MyEntry<>(key, value);        int num = (key.hashCode() & 0x7FFFFFFF) % arr.length;//也可以Math.abs(key.hashCode() % arr.length)        if (arr[num] == null) {            LinkedList list = new LinkedList();            list.add(entry);            arr[num] = list;        } else {            LinkedList list = arr[num];            for (Object obj : list) {                MyEntry e = (MyEntry) obj;                if (e.key.equals(key)) {                    e.value = value; //如果key相同,就覆盖                    return;                }            }            arr[num].add(entry);        }        size++;    }    /**     * 根据key,获取value     */    public V get(K key) {        int num = (key.hashCode() & 0x7FFFFFFF) % arr.length;//也可以Math.abs(key.hashCode() % arr.length)        if (arr[num] != null) {            LinkedList list = arr[num];            for (Object obj : list) {                MyEntry<K, V> entry = (MyEntry<K, V>) obj;                if (entry.key.equals(key)) {                    return entry.value;                }            }        }        return null;    }    /**     * key-value的封装类     */    static class MyEntry<K, V> {        K key;        V value;        MyEntry(K key, V value) {            this.key = key;            this.value = value;        }    }}

测试一下

/** * Main * * @author ALion * @version 2017/11/4 16:02 */public class Main {    public static void main(String[] args) {        MyHashMap<String, String> map = new MyHashMap<>();        map.put("zhangsan", "chongqing");        map.put("lisi", "beijing");        map.put("wangwu", "shanghai");        System.out.println(map.get("lisi"));        MyHashMap<String, Integer> map2 = new MyHashMap<>();        map2.put("zhangsan", 18);        map2.put("lisi", 26);        map2.put("lisi", 28);        System.out.println(map2.get("lisi"));        System.out.println(map2.size());    }}
原创粉丝点击