zoukankan      html  css  js  c++  java
  • hashmap原理简述

    hashmap的实现原理

    hashmap是由数组,链表,红黑树和hash算法实现的一个快速存取key-value的集合

    hashmap的底层是一个Entry类型的数组,用来保存Entry对象,也就是我们要存入的key-value键值对
    Entry是定义在Map接口中的一个内部接口,它具有key,value两个字段,在hashmap中内使用部类Node实现Entry接口并将其扩展成一个链表


    put操作

    当把一个key-value放入map集合时,首先使用hash算法对key进行散列,得到一个int类型的hashcode,再将hashcode对数组长度取余
    得到该key-value在数组中的索引,如果该索引处没有元素,则直接将key-value构建成一个Entry对象,放入该处。若已存在元素
    则遍历以该元素为头节点的链表,将当前key-value的key与该位置链表中每个元素的key进行equals比较
    如果遇到相同的key,则替换掉原有key对应的value值,否则将当前元素添加到链表尾,如果该位置链表的长度大于8,则以红黑树的形式来保存key-value

    get操作

    将key进行散列,得到一个hashcode,并将该hashcode对数组长度取余,得到该key在数组中的索引,如果数组在该索引处无元素,则直接返回null
    若有元素,则遍历以该元素为头节点的链表,将当前key与链表中每个节点的key进行equals比较,若遇到相同的key则,则返回该key对应的value值
    否则返回null


    数组:数组在内存中的表现是一段连续的内存空间,当知道某个元素在数组中的下标时,我们可以快速的计算出这个元素的内存地址,从而取出这个元素
    链表:链表在逻辑上是连续的,但在内存上的表现是分碎的,即个个节点可能存在各处。链表的优势在于快速插入和删除,但对链表的遍历是非常慢的
    红黑树:是一种相对平衡的二叉树,它的查询和增删效率介于数组和链表之间
    hash算法:是一种将key散列成数组中指定索引的技术


    为什么当数组中某个位置的链表长度大于8时,要将链表替换成红黑树

    因为链表的遍历成本比较大,当链表的长度过长时,我们对这个链表的遍历会很慢,而红黑树的查询效率比链表要快

  • 相关阅读:
    内存中字的存储
    代码段
    CPU运行的流程
    字的传送
    内存中字的存储
    c语言中求数组元素的最大值和最小值
    linux系统 centos8.3 中安装 Rsudio
    Error in .External2(C_X11, paste0("png::", filename), g$width, g$height, : 解决linux R绘图问题
    linux系统中使用R的Cairo绘制png格式图片
    c语言中利用二维数组统计考试成绩之和
  • 原文地址:https://www.cnblogs.com/misterwu/p/13607961.html
Copyright © 2011-2022 走看看