• 自己动手写HashMap


      HashMap是结合队列和链表各自的优点,创造的一种在查询和修改间取得性能平衡的一种集合!

    MyMap接口:

    package self;
    
    //接口
    public interface MyMap {
    
        public void put(Object key, Object value);
    
        public Object get(Object key);
    
    }

    此处只实现了最常用的get和put方法。

    HashMap实现:

    package self;
    
    //接口实现类
    public class MyHashMap implements MyMap {
    
        private Node[] table;// 存放map数组
    
        private int initSize;// map默认初始大小;
    
        public MyHashMap(int initSize) {
            this.initSize = initSize;
            this.table = new Node[initSize];// 创建对象时初始化大小
        }
    
        @Override
        public Object get(Object key) {
    
            int i = this.indexOf(key);
    
            Node node = this.table[i];
    
            Object compareKey = node.getKey();
    
            while (!key.equals(compareKey)) {
                node = node.nextNode;
    
                if (node == null) {
                    break;
                } else {
                    compareKey = node.getKey();
                }
            }
    
            if (node != null) {
                return node.getValue();
            }
    
            return null;
        }
    
        @Override
        public void put(Object key, Object value) {
    
            int i = this.indexOf(key);
    
            Node thisNode = new Node(key, value);
    
            if (table[i] != null) {
                Node node = table[i];
                Node next = node.nextNode;// node 关联的下一个node
    
                for (; next != null;) {
                    node = next;
                    next = node.nextNode;
                }
    
                node.setNextNode(thisNode);
    
            } else {
                table[i] = thisNode;
            }
    
        }
    
        // 计算下标位置
        private int indexOf(Object key) {
    
            if (key != null) {
                return key.hashCode() % this.initSize;// hascode值除map大小取余
            }
    
            return 0;
        }
    
        // 内部类:map节点
        private class Node {
            private Object key;
            private Object value;
            private Node nextNode;// 指向的下一个节点
    
            public Node(Object key, Object value) {
                this.key = key;
                this.value = value;
            }
    
            public Object getKey() {
                return key;
            }
    
            public Object getValue() {
                return value;
            }
    
            public void setNextNode(Node nextNode) {
                this.nextNode = nextNode;
            }
    
        }
    
    }

      1、采用最简单的: hash /  length 取余的方式去计算应存放的下标;(仅测试,实际java源码中的计算方式复杂的多)

      2、数组中存放的为Node对象,node.nextNode属性指向下一个对象;(同下标的数据通过此链表指向关联)

    测试类:

    package self;
    
    import java.util.Date;
    
    public class Test {
    
        public static void main(String[] args) {
    
            MyHashMap hashMap = new MyHashMap(3);
    
            hashMap.put("1", "111");
            hashMap.put("2", "222");
            hashMap.put(3, 333);
            hashMap.put("4", "444");
            hashMap.put("a", "aaa");
            hashMap.put("b", "bbb");
            hashMap.put("c", "ccc");
            hashMap.put("d", "ddd");
    
            System.out.println(hashMap.get(3));
        }
    }
  • 相关阅读:
    JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    生成验证码图片
    九九乘法表
    Java注解之Retention、Documented、Target、Inherited介绍
    【ztree】zTree节点增删改&ztree对树节点进行检索
    一次性搞清楚equals和hashCode
    HashMap实现原理分析
    DDL、DML和DCL的区别与理解
    MySQL的@与@@区别
    springboot整合mybatis(SSM开发环境搭建)&Springboot项目热部署
  • 原文地址:https://www.cnblogs.com/mistwalker/p/7444419.html
Copyright © 2020-2023  润新知