简单实现HashMap

上代码

package chapter01;
//简单写一下,加深理解 真实的源码比这个复杂的多 狗头保命
public class HashMap_ {

    //初始数组容量16
    Object[] objects = new Object[1 << 4];

    /**
     * put 方法
     * @param key
     * @param value
     */
    public void put(Object key,Object value){
        //根据key计算数组下标
        int index = key.hashCode() % objects.length;
        //这里% 可能是一个负数,处理一下
        if (index < 0){
//            System.out.println(index + " 为负值");
            index = Math.abs(index);
//            System.out.println("更改绝对值为: "+index);
        }
        //这里之前判断一下数组元素是否为null 多余的操作,为null直接就存里面了 也不用管
//        if (objects[index] == null){
//            objects[index] = new Node(new Entry(key,value),null);
//            return;
//        }
        //这里用的头插法
        objects[index] = new Node(new Entry(key,value), (Node) objects[index]);
    }

    /**
     * get 方法
     * @param key
     * @return
     */
    public Object get(Object key){
        //根据key计算数组下标
        int index = key.hashCode() % objects.length;
        //这里% 可能是一个负数,处理一下
        if (index < 0){
            index = Math.abs(index);
        }
        //遍历链表 找到key相等的返回
        for (Node e = (Node) objects[index]; e != null; e=e.getNext()){
            Entry content = (Entry) e.content;
            Object k = content.getKey();

            if (k == key || k.equals(key)){
                return content.value;
            }
        }
        //没有返回null
        return null;
    }

    //节点
    class Node{
        Object content;
        Node next;

        public Node(Object content, Node next) {
            this.content = content;
            this.next = next;
        }

        public Object getContent() {
            return content;
        }

        public void setContent(Object content) {
            this.content = content;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }
    }
    //k,v封装的实例
    class Entry{
        Object key;
        Object value;

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

        public Object getKey() {
            return key;
        }

        public void setKey(Object key) {
            this.key = key;
        }

        public Object getValue() {
            return value;
        }

        public void setValue(Object value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Entry{" +
                    "key=" + key +
                    ", value=" + value +
                    '}';
        }
    }

}

Test

public class HashMapTest {

    public static void main(String[] args) {
        HashMap_ hashMap_ = new HashMap_();

        for (int i = 0; i < 20; i++) {
            hashMap_.put("java"+i,"jdk"+i);
        }

        System.out.println(hashMap_.get("java14"));
    }
}
chapter01.HashMapTest
jdk14

Process finished with exit code 0
posted @ 2021-03-03 16:04  immortal_mode  阅读(87)  评论(0)    收藏  举报