Java300学习笔记(9)—— Map 和 HashMap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/86606627

1 HashMap 和 HashTable

  • 用法一样;
  • HashMap 效率高,线程不安全;
  • HashTable效率低,线程安全;

1.1 自己实现 Map (低效率版)

package day04.map;


/*
* 自定义实现 Map,效率低
* 根据键对象找对应的值对象,键不能重复
*
* */
public class MyMap {

    MyEntry[] arr = new MyEntry[990];
    int size;

    public void put(Object key, Object value) {
        MyEntry e = new MyEntry(key, value);
        for (int i = 0; i < size; i++) {
            if (arr[i].key.equals(key)) {
                arr[i].value = value;
                return;
            }
        }

        arr[size++] = e;
    }

    public Object get(Object key) {
        for (int i = 0; i < size; i++) {
            if (arr[i].key.equals(key)) {
                return arr[i].value;
            }
        }

        return null;
    }

    public boolean containKey(Object key) {
        for (MyEntry entry : arr) {
            if (entry.key.equals(key)) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        MyMap m = new MyMap();

    }
}

class MyEntry {
    Object key;
    Object value;

    public MyEntry(Object key, Object value) {
        this.key = key;
        this.value = value;
    }
}

1.2 自定义 Map(高效版)

在这里插入图片描述

package day04.map;


import java.util.LinkedList;

/*
 * 自定义 Map 升级,提高查询效率
 * */
public class MyMap2 {

    //Map 的底层结构就是 数组 + 链表
    LinkedList[] arr = new LinkedList[999];

    int size;

    public void put(Object key, Object value) {
        MyEntry e = new MyEntry(key, value);
        int a = key.hashCode() % arr.length;

        if (arr[a] == null) {
            LinkedList list = new LinkedList();
            list.add(e);
            arr[a] = list;

        } else {

            LinkedList list = arr[a];
            for (int i = 0; i < list.size(); i++) {
                MyEntry e2 = (MyEntry) list.get(i);
                if (e2.key.equals(key)) {
                    e2.value = value; //键重复,直接覆盖
                    return;
                }
            }

            arr[a].add(e);
        }
    }

    public Object get(Object key) {
        int a = key.hashCode() % arr.length;
        if (arr[a] != null) {
            LinkedList list = arr[a];
            for (int i = 0; i < list.size(); i++) {
                MyEntry e = (MyEntry) list.get(i);
                if (e.key.equals(key)) {
                    return e.value;
                }
            }
        }

        return null;
    }


    public static void main(String[] args) {
        MyMap2 m = new MyMap2();
        m.put("Mike", new Wife("Mary"));
        m.put("Mike", new Wife("Sally"));

        Wife w = (Wife) m.get("Mike");

        System.out.println(w.name);

    }
}

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/86606627
今日推荐