您当前的位置:首页 > 互联网百科 > 区块链

浅谈HashMap原理,并手写HashMap并实现部分区块链特征

时间:2022-09-08 11:29:35  来源:今日头条  作者:Java那点事儿

写在前面

最近有很多的粉丝私信我,说自己在面试的时候,老是被人问HashMap的原理,但是在实际的工作中,也只是使用HashMap,从来就没有关注过它的原来,今天博主本人,根据自己的实际经验,浅谈一下HashMap的实现原理。并附上自己根据原理,手写的MHashMap,并且还带上了部分区块链的特征。

JDK7和JDK8中的HashMap

JDK7:数组和链式结构 JDK8:数组和链式结构,红黑树 两者之间的区别就是,JDK8中加上了红黑树。 因为今天是一个HashMap的原理浅析,这里就不附带讲解红黑树,后面的博文,我会专门来讲解红黑树。

正文

现在我开始正式进入我对HashMap讲解中来。 HashMap的特征

存储结构:key,value键值对的形式

查询数据: 1,通过key进行mod(取模),获取到当前数组对应的node, 2,根据node存放的hash和key对应的hash进行比较,是否一致,如果不一致,则同当前node的下一个node进行比对。 3,还是不一致,就继续从当前比较的Node取下一个节点进行比较。

存储数据: 1,对key进行mod计算 2,将数据存放到data[mod]中去 3,如果当前的data[mod]已经有值存在了,则将当前已经存在的对象oldNode,存放到新的Node的next中去

我们定义一个数组,并给给它一个默认的长度

private final static int defaultDataLength = 16;

再创建一个指定长度的数组

private Node[] data = new Node[defaultDataLength];

这里的Node为我们自己定义的一个内部类对象

@Getter
    @Setter
    static class Node {
        private int hashCode;
        private Object key;
        private Object value;
        private Node next;

        public static Node instance(int hashCode, Object key, Object value, Node next) {
            Node node = new Node();
            node.setHashCode(hashCode);
            node.setKey(key);
            node.setValue(value);
            node.setNext(next);
            return node;
        }
    }

它由四个元素组成,当前传入key的hash值,当前的key,当前的value及下一个对象。

完整代码

package com.moonl.jvm.utils;

import lombok.Getter;
import lombok.Setter;

import JAVA.io.Serializable;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;

public class MHashMap<K, V> {

    private final static int defaultDataLength = 16;

    private Node[] data = new Node[defaultDataLength];

    private Integer previousHashCode = 0;


    public V put(K key, V value) {
        int hash = hash(key);
        int mod = hashMod(key);
        if (null == data[mod]) {
            data[mod] = Node.instance(hash, key, value, null);
            return value;
        }
        //旧的node缓存
        Node oldNode = data[mod];
        //新的key,存放到指定位置的数组中去,并将原有节点存放到next中
        data[mod] = Node.instance(hash, key, value, oldNode);
        return value;
    }

    public V get(K key) {
        Node node = data[hashMod(key)];
        //root node hashCode
        this.previousHashCode = hash((K) ("root_" + hashMod(key)));
        return findKey(node, key);
    }


    public V findKey(Node node, K key) {

        if (null == key) {
            return null;
        }
        if (node == null) {
            return null;
        }
        String chAIn = "The Previous HashCode:" + previousHashCode + " Now HashCode :" + node.getHashCode();
        //传入的key对应的hash
        int hash = hash(key);
        //当前节点存储的hashCode
        int hashCode = node.getHashCode();
        if (hash == hashCode) {
            System.out.println("input key is :" + key + " and hash:" + hashCode);
            System.out.println("query key is :" + node.getKey() + " and hash:" + node.getHashCode());
            return (V) node.getValue();
        }
        //当前找到的节点的下一个节点
        Node nextNode = node.getNext();
        //如果要从下一个节点开始查询,则当前节点变更为上一个节点
        previousHashCode = node.getHashCode();
        chain = chain + " Next Node HashCode :" + nextNode.getHashCode();
        System.out.println(chain);
        return findKey(nextNode, key);
    }

    public int hash(K key) {
        int hashCode = 0;
        return key == null ? 0 : key.hashCode();
    }

    public int hashMod(K key) {
        return Math.abs(key.hashCode() % 16);
    }

    @Getter
    @Setter
    static class Node {
        private int hashCode;
        private Object key;
        private Object value;
        private Node next;

        public static Node instance(int hashCode, Object key, Object value, Node next) {
            Node node = new Node();
            node.setHashCode(hashCode);
            node.setKey(key);
            node.setValue(value);
            node.setNext(next);
            return node;
        }
    }


}

在代码中,我对根节点,也就是数组节点的记录方式是"root_"+mod值共同生成的hash // 现在我们开始使用封装数据(put),并逐步(get)数据

@Test
    public void testHashMap() {
//        Map<String, Object> maps = new HashMap<String, Object>();
        MHashMap<String, Object> zhaoMaps = new MHashMap<String, Object>();
        for (int i = 0; i < 1000; i++) {
            zhaoMaps.put("赵"+i+"姐","赵颖"+i+"姐 is 250");
        }
        MHashMap<String, Object> yingMaps = new MHashMap<String, Object>();
        for (int i = 0; i < 1000; i++) {
            yingMaps.put("大颖"+i+"姐","大颖"+i+"姐 is 250");
        }
        System.out.println(zhaoMaps.get("赵162姐"));
        System.out.println(yingMaps.get("大颖456姐"));
    }

输出的结果是

The Previous HashCode:-925311973 Now HashCode :-914498616 Next Node HashCode :-914499608
The Previous HashCode:-914498616 Now HashCode :-914499608 Next Node HashCode :-914500600
The Previous HashCode:-914499608 Now HashCode :-914500600 Next Node HashCode :-914501592
The Previous HashCode:-914500600 Now HashCode :-914501592 Next Node HashCode :-914502584
The Previous HashCode:-914501592 Now HashCode :-914502584 Next Node HashCode :-914503576
The Previous HashCode:-914502584 Now HashCode :-914503576 Next Node HashCode :-914529368
The Previous HashCode:-914503576 Now HashCode :-914529368 Next Node HashCode :-914530360
The Previous HashCode:-914529368 Now HashCode :-914530360 Next Node HashCode :-914531352
The Previous HashCode:-914530360 Now HashCode :-914531352 Next Node HashCode :-914532344
The Previous HashCode:-914531352 Now HashCode :-914532344 Next Node HashCode :-914533336
The Previous HashCode:-914532344 Now HashCode :-914533336 Next Node HashCode :-914560120
The Previous HashCode:-914533336 Now HashCode :-914560120 Next Node HashCode :-914561112
The Previous HashCode:-914560120 Now HashCode :-914561112 Next Node HashCode :-914562104
The Previous HashCode:-914561112 Now HashCode :-914562104 Next Node HashCode :-914563096
The Previous HashCode:-914562104 Now HashCode :-914563096 Next Node HashCode :-914584424
The Previous HashCode:-914563096 Now HashCode :-914584424 Next Node HashCode :-914590872
The Previous HashCode:-914584424 Now HashCode :-914590872 Next Node HashCode :-914591864
The Previous HashCode:-914590872 Now HashCode :-914591864 Next Node HashCode :-914592856
The Previous HashCode:-914591864 Now HashCode :-914592856 Next Node HashCode :-914614184
The Previous HashCode:-914592856 Now HashCode :-914614184 Next Node HashCode :-914615176
The Previous HashCode:-914614184 Now HashCode :-914615176 Next Node HashCode :-914621624
The Previous HashCode:-914615176 Now HashCode :-914621624 Next Node HashCode :-914622616
The Previous HashCode:-914621624 Now HashCode :-914622616 Next Node HashCode :-914643944
The Previous HashCode:-914622616 Now HashCode :-914643944 Next Node HashCode :-914644936
The Previous HashCode:-914643944 Now HashCode :-914644936 Next Node HashCode :-914645928
The Previous HashCode:-914644936 Now HashCode :-914645928 Next Node HashCode :-914652376
The Previous HashCode:-914645928 Now HashCode :-914652376 Next Node HashCode :-914673704
The Previous HashCode:-914652376 Now HashCode :-914673704 Next Node HashCode :-914674696
The Previous HashCode:-914673704 Now HashCode :-914674696 Next Node HashCode :-914675688
The Previous HashCode:-914674696 Now HashCode :-914675688 Next Node HashCode :-914676680
The Previous HashCode:-914675688 Now HashCode :-914676680 Next Node HashCode :-914703464
The Previous HashCode:-914676680 Now HashCode :-914703464 Next Node HashCode :-914704456
The Previous HashCode:-914703464 Now HashCode :-914704456 Next Node HashCode :-914705448
The Previous HashCode:-914704456 Now HashCode :-914705448 Next Node HashCode :-914706440
The Previous HashCode:-914705448 Now HashCode :-914706440 Next Node HashCode :-914707432
The Previous HashCode:-914706440 Now HashCode :-914707432 Next Node HashCode :-914733224
The Previous HashCode:-914707432 Now HashCode :-914733224 Next Node HashCode :-914734216
The Previous HashCode:-914733224 Now HashCode :-914734216 Next Node HashCode :-914735208
The Previous HashCode:-914734216 Now HashCode :-914735208 Next Node HashCode :-914736200
input key is :赵162姐 and hash:-914736200
query key is :赵162姐 and hash:-914736200
赵颖162姐 is 250
The Previous HashCode:-925311975 Now HashCode :-2010266582 Next Node HashCode :-2010267574
The Previous HashCode:-2010266582 Now HashCode :-2010267574 Next Node HashCode :-2010268566
The Previous HashCode:-2010267574 Now HashCode :-2010268566 Next Node HashCode :-2010269558
The Previous HashCode:-2010268566 Now HashCode :-2010269558 Next Node HashCode :-2010270550
The Previous HashCode:-2010269558 Now HashCode :-2010270550 Next Node HashCode :-2010271542
The Previous HashCode:-2010270550 Now HashCode :-2010271542 Next Node HashCode :-2010296342
The Previous HashCode:-2010271542 Now HashCode :-2010296342 Next Node HashCode :-2010297334
The Previous HashCode:-2010296342 Now HashCode :-2010297334 Next Node HashCode :-2010298326
The Previous HashCode:-2010297334 Now HashCode :-2010298326 Next Node HashCode :-2010299318
The Previous HashCode:-2010298326 Now HashCode :-2010299318 Next Node HashCode :-2010300310
The Previous HashCode:-2010299318 Now HashCode :-2010300310 Next Node HashCode :-2010301302
The Previous HashCode:-2010300310 Now HashCode :-2010301302 Next Node HashCode :-2010302294
The Previous HashCode:-2010301302 Now HashCode :-2010302294 Next Node HashCode :-2010326102
The Previous HashCode:-2010302294 Now HashCode :-2010326102 Next Node HashCode :-2010327094
The Previous HashCode:-2010326102 Now HashCode :-2010327094 Next Node HashCode :-2010328086
The Previous HashCode:-2010327094 Now HashCode :-2010328086 Next Node HashCode :-2010329078
The Previous HashCode:-2010328086 Now HashCode :-2010329078 Next Node HashCode :-2010330070
The Previous HashCode:-2010329078 Now HashCode :-2010330070 Next Node HashCode :-2010331062
The Previous HashCode:-2010330070 Now HashCode :-2010331062 Next Node HashCode :-2010332054
The Previous HashCode:-2010331062 Now HashCode :-2010332054 Next Node HashCode :-2010333046
The Previous HashCode:-2010332054 Now HashCode :-2010333046 Next Node HashCode :-2010355862
The Previous HashCode:-2010333046 Now HashCode :-2010355862 Next Node HashCode :-2010356854
The Previous HashCode:-2010355862 Now HashCode :-2010356854 Next Node HashCode :-2010357846
The Previous HashCode:-2010356854 Now HashCode :-2010357846 Next Node HashCode :-2010358838
The Previous HashCode:-2010357846 Now HashCode :-2010358838 Next Node HashCode :-2010359830
The Previous HashCode:-2010358838 Now HashCode :-2010359830 Next Node HashCode :-2010360822
The Previous HashCode:-2010359830 Now HashCode :-2010360822 Next Node HashCode :-2010361814
The Previous HashCode:-2010360822 Now HashCode :-2010361814 Next Node HashCode :-2010362806
The Previous HashCode:-2010361814 Now HashCode :-2010362806 Next Node HashCode :-2010363798
The Previous HashCode:-2010362806 Now HashCode :-2010363798 Next Node HashCode :-2010385622
The Previous HashCode:-2010363798 Now HashCode :-2010385622 Next Node HashCode :-2010386614
The Previous HashCode:-2010385622 Now HashCode :-2010386614 Next Node HashCode :-2010387606
The Previous HashCode:-2010386614 Now HashCode :-2010387606 Next Node HashCode :-2010388598
The Previous HashCode:-2010387606 Now HashCode :-2010388598 Next Node HashCode :-2010389590
The Previous HashCode:-2010388598 Now HashCode :-2010389590 Next Node HashCode :-2010390582
The Previous HashCode:-2010389590 Now HashCode :-2010390582 Next Node HashCode :-2010391574
The Previous HashCode:-2010390582 Now HashCode :-2010391574 Next Node HashCode :-2010392566
The Previous HashCode:-2010391574 Now HashCode :-2010392566 Next Node HashCode :-2010393558
The Previous HashCode:-2010392566 Now HashCode :-2010393558 Next Node HashCode :-2010394550
The Previous HashCode:-2010393558 Now HashCode :-2010394550 Next Node HashCode :-2010416374
The Previous HashCode:-2010394550 Now HashCode :-2010416374 Next Node HashCode :-2010417366
The Previous HashCode:-2010416374 Now HashCode :-2010417366 Next Node HashCode :-2010418358
The Previous HashCode:-2010417366 Now HashCode :-2010418358 Next Node HashCode :-2010419350
input key is :大颖456姐 and hash:-2010419350
query key is :大颖456姐 and hash:-2010419350
大颖456姐 is 250

通过输出的日志,我们可以看见,node节点的存储结构是按照区块链的特性,记录上个节点的信息和下一个节点的信息关系来存储数据。

当然,这里我们对Node对象再写深入一些,加上一些共识的算法,加密解密验签的算法,并做节点的共享,那么一个简单的区块链就完成了。

本文,主要是为了解答粉丝在面试过程中,面试官不停问HashMap原理而编写的,区块链就不做更多的阐述了。



Tags:HashMap   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Search: HashMap  点击:(11)  评论:(0)  加入收藏
HashMap:Java中的高效数据结构
HashMap是Java中常用的数据结构之一,它实现了Map接口,并且提供了快速的查找、插入和删除操作。HashMap的底层数据结构是数组和链表(或红黑树)的组合,这种数据结构被称为哈希表(Has...【详细内容】
2023-11-24  Search: HashMap  点击:(333)  评论:(0)  加入收藏
HashMap的底层数据结构
在 JDK1.8 中,HashMap 还引入了一个新的概念,叫做负载因子(load factor),它是指哈希表中键值对的数量与数组长度的比值。当键值对的数量超过了负载因子与数组长度的乘积时,就会...【详细内容】
2023-09-15  Search: HashMap  点击:(239)  评论:(0)  加入收藏
HashMap 的基础结构,必须掌握!
HashMap 是一种散列表,它存储的内容是键值对(key-value)映射。在 HashMap 中,每个键(key)映射到一个值(value)。散列表的工作原理是:当通过 put() 方法将键值对存储在 HashMap...【详细内容】
2023-09-14  Search: HashMap  点击:(278)  评论:(0)  加入收藏
HashMap 是怎么解决哈希冲突的?
前言 今天来分享一道比较好的面试题,“HashMap 是怎么解决哈希冲突的?”对于这个问题,我们一起看看考察点和比较好的回答吧!考察点 现在的企业级开发中HashMap几乎是...【详细内容】
2023-09-11  Search: HashMap  点击:(199)  评论:(0)  加入收藏
搞懂hashMap底层原理
说明hashMap在java1.7和java1.8版本中有做一些调整,我们本篇只说java1.7的hashMap。数据结构hashMap的数据结构是由数组和链表组成,table是一个存放Entry对象的数组,每个Entry...【详细内容】
2023-08-03  Search: HashMap  点击:(108)  评论:(0)  加入收藏
HashMap线程不安全体现在哪里?
HashMap线程不安全体现在哪里?如果你到现在还不清楚赶紧看下去,明明白白补一补~。在Java中,HashMap是一种常用的数据结构,它以键值对的形式存储和管理数据。然而,由于HashMap在...【详细内容】
2023-04-27  Search: HashMap  点击:(291)  评论:(0)  加入收藏
如何实现线程安全的HashMap?
要实现线程安全的 HashMap,可以考虑以下几种方法: 使用 ConcurrentHashMap:ConcurrentHashMap 是线程安全的 HashMap 实现,采用了分段锁的机制,可以提高并发性能。 使用 Collecti...【详细内容】
2023-03-21  Search: HashMap  点击:(266)  评论:(0)  加入收藏
三分钟轻松搞懂 HashMap 死循环问题!
HashMap 死循环发生在 JDK 1.7 版本中,形成死循环的原因是 HashMap 在 JDK 1.7 使用的是头插法,头插法 + 链表 + 多线程并发 + HashMap 扩容,这几个点加在一起就形成了 HashMap...【详细内容】
2023-01-31  Search: HashMap  点击:(257)  评论:(0)  加入收藏
HashMap核心原理分析
学习目标1、hash冲突的解决办法有哪几种2、HashTable、hashmap、CHM三者之间的区别3、HashMap的默认长度是多少?默认扩容因子是多少?4、HashMap它是怎么解决hash冲突的5、Hash...【详细内容】
2022-09-13  Search: HashMap  点击:(137)  评论:(0)  加入收藏
▌简易百科推荐
区块链在网络安全领域的十大应用案例
在网络安全的动态格局中,威胁与防御一样快速发展,区块链作为坚定的守护者出现,彻底改变了数字安全的范式。除了加密货币的起源之外,区块链技术还因其对加强网络防御的变革性影响...【详细内容】
2023-12-12    千家网  Tags:区块链   点击:(43)  评论:(0)  加入收藏
区块链dapp开发模式
区块链Dapp开发的模式有三种:1.点对点交易模式:这种模式是指两个用户之间直接进行交易,无需通过中间方进行撮合。在Dapp系统中,点对点交易模式可以大大降低交易成本和时间,同时也...【详细内容】
2023-12-06  天晟区块链开发    Tags:区块链   点击:(53)  评论:(0)  加入收藏
2024年最热门的区块链趋势
在快速发展的区块链技术世界中,每年都会带来重塑行业的新创新和趋势。步入 2024 年,我们正处于一些令人兴奋的发展的风口浪尖,这些发展将彻底改变区块链格局。本文将作为您了解...【详细内容】
2023-12-06  李留白  微信公众号  Tags:区块链   点击:(83)  评论:(0)  加入收藏
每个人都应该做好准备的 2024 年区块链十大趋势
作为一名未来学家,我认为展望未来是我的工作,因此今年我想介绍将在未来 12 个月内塑造数字世界的新兴区块链趋势。哪些技术最受关注?企业领导者需要做好准备的最大趋势是什么?本...【详细内容】
2023-11-27  李留白  微信公众号  Tags:区块链   点击:(81)  评论:(0)  加入收藏
区块链你接触了么?
最近什么概念最火?毫无疑问是“区块链”。吃个饭,五桌有四桌都在跟你聊区块链。然而大部分人对“区块链”好奇,甚至眼馋,大都处于不求甚解的懵逼阶段。小编最近集中进行了研究,了...【详细内容】
2023-11-13  叮当天使    Tags:区块链   点击:(47)  评论:(0)  加入收藏
DAPP 区块链去中心化应用
DAPP是基于P2P对等网络而运行在智能合约之上的分布式应用程序,区块链则为其提供可信的数据记录。DAPP必须是开源、自治的。可以由用户自由打包生成,签名标记所属权,它的发布不...【详细内容】
2023-10-28  软件开发阿辉    Tags:DAPP   点击:(64)  评论:(0)  加入收藏
花旗、摩根大通纷纷入局 区块链将如何改变金融服务?
金色财经 作者:Stephen Gandel前摩根大通高管、华尔街最著名的金融家之一Blythe Masters于2015年被任命为区块链公司Digital Asset Holdings的首席执行官,许多人认为这是一种...【详细内容】
2023-10-26    金色财经  Tags:区块链   点击:(62)  评论:(0)  加入收藏
供应链NFT及其工作原理指南
编辑丨lee@Web3CN.Pro供应链是商业中的一股隐藏力量,负责将食物运送到杂货店、将 T 恤运送到服装店、将汽车运送到经销商。这些人员和企业网络旨在尽可能快速、廉价地生产并...【详细内容】
2023-10-24    市场资讯  Tags:NFT   点击:(78)  评论:(0)  加入收藏
“过气”的区块链,行业寒冬中的矿工
作者|陈默编辑|江岳炒币和挖矿已经过时了,至少在中国是如此。“现在没人提什么区块链了,玩的是AI。”当10月初比特大陆有关欠薪风波的消息传出后,有网友在weibo上表示。在社交...【详细内容】
2023-10-23  首席人物观    Tags:区块链   点击:(55)  评论:(0)  加入收藏
数字酒证是什么,高端白酒收藏投资价值如何?
随着经济的不断发展,高端白酒市场也在不断的增长。高端白酒收藏投资价值逐渐受到关注,吸引了大部分投资者的目光。并且随着数字时代的到来,白酒行业作为一个传统的行业正在朝着...【详细内容】
2023-10-10  执棋参禅    Tags:   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条