zoukankan      html  css  js  c++  java
  • HashMap为什么存取效率那么高?

    1、Hash

    也叫散列、哈希。

    主要用于信息安全领域中的算法,把长度不同的信息转化为杂乱的128位的编码,找到一种数据内容与地址之间的映射关系。

    注意:不同的输入可能会散列成相同的输出

    我们最熟悉的Object类中就提供了hashcode的方法。

    public native int hashCode();

    2、数据结构

    Java集合的实现底层大都是基本数据结构的又一层封装。

    数组:寻址容易,插入和删除困难

    链表正好相反。

    HashMap正好将二者互补了一下,推出了链表+数组的组合方式,也叫链表散列、“拉链法”。

    结构示意图:

    这里写图片描述

    放入元素时,根据key值通过hashcode找到对应数组的位置,放入横向数组的某个格子中。因为前面说到hashcode值不能保证唯一,如果之后hashcode值对应的数组位置中已经有值,就放到相连的链表中。

    查找元素也是按这个过程来进行。

    代码实现:

    注意:每个Node中都持有下一个节点的引用。 
    这里写图片描述 

    3、算法优化

    由上面的数据结构介绍,可以看出,在查找的时候,尽量避免查找链表能够大大提高存取效率。

    目标:元素尽可能均匀分布,这样查找的时候不必查找链表,效率很高。

    思路一:

    取模运算,实现是可以实现,但取模运算消耗大、效率不高。

    思路二:

    首先,&运算比取模运算效率高。 
    hashmap采用的是下面这种与运算。

    这里写图片描述

    大同小异,都是为了减少碰撞,避免hash到同一个位置,使元素分布更均匀。在实现的基础上,考虑性能问题。

  • 相关阅读:
    《linux/unix设计思想》读后感
    webserver ZooKeeper Cluster
    OS + RedHat 6.3 x64 / sshd X11 /
    nGrinder SocketTest.groovy
    OS + Centos7.6 gdm / xmanager xstart
    OS + CentOS 7 / VirtualBox 6.0 / VMware-Workstation-Full-15.1.0
    浅谈MySQL Replication(复制)基本原理
    MySQL存储引擎比较
    explain SQL语句性能检测
    看看JavaScript中void(0)的含义
  • 原文地址:https://www.cnblogs.com/justuntil/p/10531709.html
Copyright © 2011-2022 走看看