自行实现Map底层结构(数组+链表) --Java版

来源:互联网 发布:sql查询语句实例股票 编辑:程序博客网 时间:2024/06/13 13:10
package Map;import Collection.TestLinkedList;/* * 自定义实现Map功能(底层:数组+链表) * Map:存放键值对,根据键找值 * 目的仅为更加了解该结构、编码部分不考虑细节 * 注意注释部分 * */class Entry<K, V> {    K Key;    V Value;    public Entry(K key, V value) {        super();        Key = key;        Value = value;    }}public class RealizeMap<K, V, E> {    @SuppressWarnings("unchecked")    TestLinkedList<Entry<K, V>> arr[] = new TestLinkedList[165];    int size;    RealizeMap() {        size = 0;    }    public void put(K key, V value) {        // 注意不能漏了->处理键值覆盖        Entry<K, V> e = new Entry<>(key, value);        int hash = key.hashCode() % 165;        if (arr[hash] == null) {            TestLinkedList<Entry<K, V>> list = new TestLinkedList<>();            arr[hash] = list;            list.addLast(e);        }else {            for(int i=0;i<arr[hash].size;i++) {                Entry<K, V> E = arr[hash].get(i);//由于E在此取义为该链表键对应节点的地址,所以直接改E即可覆盖之                if(E.Key.equals(key)) {                    E.Value = value;                    return;                }            }            arr[hash].addLast(e);        }    }    public V get(K key) {        int hash = key.hashCode();        if (arr[hash] != null) {            for (int i = 0; i < arr[hash].size; i++) {                if (arr[hash].get(i).Key.equals(key))                    return arr[hash].get(i).Value;            }        }        return null;    }    public static void main(String[] args) {        RealizeMap<String, String, Entry<String, String>> map = new RealizeMap<>();        map.put("1", "张三");        map.put("2", "李四");        map.put("2", "黎明");        map.put("3", "王五");        map.put("4", "马六");        System.out.println(map.get("2"));    }}
0 0
原创粉丝点击