从零开始实现一个HashMap

将会从简单到复杂,一步步地实现跟源码一样的HashMap

一:仅使用数组存储

/** 
 * 一:数组
 * 二:数组 + 链表
 * 三:数组 + 链表 + resize
 * 四:数组 + 链表 + 二叉搜索树
 * 五:数组 + 链表 + 红黑树
 */
public class HashMap_my<K,V> {
   
    /**
     *  官方源码数组长度默认为16,此处为4,总之为2的N次方就好
     */
    Node<K,V>[] elementDate = new Node[4];

    class Node<K,V> {
   
        int hash;
        K key;
        V value;

        public Node(int hash, K key, V value) {
   
            this.hash = hash;
            this.key = key;
            this.value = value;
        }
    }

    public void put(K key,V value) {
   
        int hash = key.hashCode();
        /**
         * 因为还没使用链表,此处Node还没next属性
         */
        final Node<K, V> newNode = new Node<>(hash, key, value);
        /** 
         * 有两种计算索引的方式:
 		 * 1、int index = hash & (elementDate.length - 1)
 		 * 2、int index = hash % elementDate.length
 		 * 当length为2的N次方时,1跟2计算结果是一样的,此处可自行查阅验证
 		 */
        int index = hash % elementDate.length;
        elementDate[index] = newNode;
    }

    public V get(K key) {
   
        int hash = key.hashCode();
        int index = hash % elementDate.length;
        return elementDate[index].value;
    }

    public static void main(String[] args) {
   
        final HashMap_my<Object, Object> hashMap = new HashMap_my<>();
        hashMap.put("k1","v1");
        hashMap.put("k2","v2");
        System.out.println(hashMap.get("k1")); // v1
        System.out.println(hashMap.get("k2")); // v2
    }
}

下面我要对上面代码进行两个优化:
优化1:求hash值
优化2:计算数组下标索引

public class HashMap_my<K,V> {
   
    
    Node<K,V>[] elementDate = new Node[4];

    class Node<K,V> {
   
        int hash;
        K key;
        V value;

        public Node(int hash, K key, V value) {
   
            this.hash = hash;
            this.key = key;
            this.value = value;
        }
    }

    public void put(K key,V value) {
   
    	/**
    	 * 一个int有4字节32位,
    	 * 此处是将hashCode的高16位跟低16位进行异或组成新的低16位,高16位不变
    	 */
        int hash = key.hashCode() ^ (key.hashCode() >>> 16);
        final Node<K, V> newNode = new Node<>(hash, key, value);
        /**
         * hash & (elementDate.length - 1) 与 hash % elementDate.length
 		 * 当length为2的N次方时,1跟2计算结果是一样的
         */
        int index = hash & (elementDate.length - 1);
        elementDate[index] =
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值