当前位置: 首页 > news >正文

博客网站建设设计报告seo线下培训机构

博客网站建设设计报告,seo线下培训机构,宁波网站建设icp备,建设部网站注册查询HashMap相关问题 HashMap实现原理 HashMap是以键值对的形式存储数据,内部是通过数组链表结构实现,在1.7之后的版本,链表结构可以升级为红黑树,提高查询效率 key和value都支持为null;key为null时hash值是0&#xff0…

HashMap相关问题

HashMap实现原理

HashMap是以键值对的形式存储数据,内部是通过数组+链表结构实现,在1.7之后的版本,链表结构可以升级为红黑树,提高查询效率

  • key和value都支持为null;key为null时hash值是0,取模后也是0 ,也是就是会存放在数组第一个链表中

HashMap的put、get、remove过程

put过程:

  • 先根据key值计算Hash值

  • 再根据hash值与数组长度进行取模运算,计算出要落在数组哪个位置上

  • 接着判断数组是否为空,为空的话对数组进行初始化,默认数组容量是16

  • 然后判断该数组位置是否已经存在元素,如果不存在则直接创建Node结点放入数组对应位置

  • 如果存在则继续判断是否是红黑树,如果是红黑树则在红黑树中创建或者更新Node结点

  • 如果是链表结构,则先插入元素,然后判断链表中元素个数是否已经到达阈值8个,如果到达了,并且数组容量大于64个,则将当前链表升级为红黑树结构,如果不足64则进行一次扩容

    • 在扩容时,红黑树会进行拆分,拆分过程中会判断红黑树中结点是否少于阈值6个,如果是的话变回链表结构

    • remove元素时判断根节点和左右子节点是否为null来决定是否转回链表结构,而没有根据阈值6来判断

  • 最后插入完元素后,会判断当前元素总的个数是否达到阈值,默认是数组容量的3/4,如果达到了则进行扩容

    • 3/4是根据空间和时间综合判定的,如果设置过小,则扩容频繁,如果设置过大,则hash冲突概率增加,查找效率更低

get过程:

  • 先通过key计算hash值,然后与数组长度取模运算确定在数组中的位置

  • 然后判断数组中对应元素key值是否相同,相同则返回该结点的value值

  • 接着判断是否是红黑树,如果是的话从红黑树中查找该key对应结点

  • 如果是链表则遍历链表中每一个元素找到key值相同的Node结点并返回value值

remove过程:

  • remove过程和查找差不多,也是先计算hash值,取模计算出数组位置,然后判断是否红黑树等等,找到元素后从原来位置删除

  • 从红黑树中删除之后,会判断根节点以及其左右结点是否为空来决定要不要转回链表结构

容量转为2的n次幂

  • int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16;

  • 现将设置的容量减1,然后不断进行右移和或运算,目的是将低位上的数都转为1(0000 1111);最后再+1,形成(0001 0000)这种结构,结果必然是2的n次方

Hash算法和Hash冲突问题

  • (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)

  • key可以为null

  • hash值的计算:key的hash值与它的高16位右移后进行异或运算,目的是为了降低低16位相同的概率,从而减少hash碰撞

    • 这是因为跟数组长度-1进行与运算时,数组长度-1的高位基本都是0,进行与运算后结果也是0 ,如果两个数高位不同,低位相同,就会导致计算结果一致,发生hash碰撞;

    • 所以需要降低低位相同的概率,就能减少hash碰撞

  • 为什么进行异或运算,而不是与运算或者或等其他运算?

    • 因为如果进行与运算,会导致结果趋向于0更多

    • 进行或运算,结果趋向于1更多

    • 只有进行异或运算,结果0和1的个数会趋于一样多,这样结果随机性就更大,hash碰撞概率就小很多

  • 降低hash冲突办法:

    • 计算hash值的时候进行异或运算

    • 降低负载因子(load factor),增加数组容量大小

计算数组中的位置

  • (n - 1) & hash

  • 根据Hash值和数组长度减1进行与运算;相当于对数组长度取模运算,保证取模后结果在数组长度范围内;与运算速度要比取模运算快

    • 数组容量大小是2的n次方,可以保证数组大小-1后与hash值与运算后结果在数组范围内,取代模运算,效率更高

HashMap扩容机制

  • 扩容时会先判断容量是否有初始化,如果没有则先初始化为默认容量16或者传入的容量,容量最大不能超过2的30次方

  • 然后判断当前容量是否超过阈值,默认是当前容量的3/4,如果超过则进行扩容,每次扩容会把容量增加到原来的2倍

  • 接着会将原来数组中的数据根据hash值复制到扩容后的数组中,在拷贝数据过程中,原有链表或者红黑树会被拆分成两份,一部分会保存在原有数组位置,另一部分会存在当前数组位置加上原有数组容量大小的位置

  • 根据if ((e.hash & oldCap) == 0) 判断链表中的元素是否需要移动,如果等于0则不移动,否则移动到当前数组位置加上旧数组容量大小的位置:newTab[j+oldCap]

    • 因为同一个Hash值跟数组扩容前和扩容后的大小进行取模运算后,只有两种情况,要么跟原来位置不变,要么比原来位置多原来数组容量大小
  • 扩容导致死循环问题

    • 因为在1.7版本中,HashMap扩容时采用的是头插法,也就是拷贝旧数组中元素到新数组中时,新元素是插入到链表头部的,当并发时可能出现多个线程同时在扩容,当其中一个线程正在将元素A移动到新的位置时,A的下一个元素时B,另一个线程正在将B插入A的前面,但是A指向B的链接还没有断开,B就指向了A,这就会导致A和B互相链接着形成环状,当调用get方法遍历链表时就可能会卡死在这里永远无法退出循环

HashMap如何保证线程安全

HashTable

  • 底层实现也是数组+链表

  • 使用了Synchronized同步锁,会锁住整个HashTable对象,效率低

  • 线程安全,key和value都不能为null

ConcurrentHashMap

  • 线程安全

  • 将整个Map分成N个段Segment保存在数组中,每个Segment又可以看做一个小型的HashMap,内部由数据+链表结构实现,Segment继承自可重入锁;

  • 锁分段技术,每一个Segment都是一个可重入锁,每次只会锁住该段中的元素,不会影响到其他段中元素的读写

  • 扩容采用段内扩容,每次扩容只针对当前Segment,不会对整个表扩容

  • 有些操作需要锁定整个表,比如获取所有元素个数size,或者判断某个元素是否在表中containsValue操作

    • 在计算size时会先尝试几次不加锁统计,当发现算了几次结果都一样时,则任务没有新增或者删除,如果有变化则强制将所有Segment加锁后再统计
  • jdk1.8后的变化:

  • 参考地址:https://blog.csdn.net/qq_26542493/article/details/105651338&cd=1&hl=zh-CN&ct=clnk&gl=ph&strip=1

HashMap是否有序,如何保证有序?

无序的,LinkedHashMap可以保证有序

为什么容量必须是2的N次方

  • 很多地方用到二进制运算,比如计算hash值,计算数组中的位置,扩容等;使用2的N次方转成二进制就是一个1,其他都是0,方便二进制运算

参考链接:https://blog.csdn.net/qq_26542493/article/details/105482732&cd=1&hl=zh-CN&ct=clnk&gl=ph&strip=1


文章转载自:
http://dinncosplitsaw.zfyr.cn
http://dinncometonymy.zfyr.cn
http://dinncobanquette.zfyr.cn
http://dinncomugearite.zfyr.cn
http://dinncorow.zfyr.cn
http://dinncoelitism.zfyr.cn
http://dinncocoolish.zfyr.cn
http://dinncosonicguide.zfyr.cn
http://dinncodiplegic.zfyr.cn
http://dinncotubulate.zfyr.cn
http://dinncoinfluent.zfyr.cn
http://dinncorematch.zfyr.cn
http://dinncopretrial.zfyr.cn
http://dinncotrionym.zfyr.cn
http://dinncosociolinguistics.zfyr.cn
http://dinncoveining.zfyr.cn
http://dinncojuvenility.zfyr.cn
http://dinncoburhel.zfyr.cn
http://dinncobreadthwise.zfyr.cn
http://dinncowhirligig.zfyr.cn
http://dinncotragicomical.zfyr.cn
http://dinncobenzoline.zfyr.cn
http://dinncocleanup.zfyr.cn
http://dinncounthanked.zfyr.cn
http://dinncojuvenility.zfyr.cn
http://dinncotlc.zfyr.cn
http://dinncoaspergillum.zfyr.cn
http://dinncononuse.zfyr.cn
http://dinncophylum.zfyr.cn
http://dinncocredential.zfyr.cn
http://dinncosocializee.zfyr.cn
http://dinncocaiman.zfyr.cn
http://dinncodilutedness.zfyr.cn
http://dinncoautocorrelation.zfyr.cn
http://dinncoburr.zfyr.cn
http://dinncozoophoric.zfyr.cn
http://dinncomanners.zfyr.cn
http://dinncokoniscope.zfyr.cn
http://dinncohootch.zfyr.cn
http://dinncodogbane.zfyr.cn
http://dinncofalange.zfyr.cn
http://dinncochorda.zfyr.cn
http://dinncodipster.zfyr.cn
http://dinncohistogen.zfyr.cn
http://dinncoadvect.zfyr.cn
http://dinncoancientry.zfyr.cn
http://dinnconubility.zfyr.cn
http://dinncometalist.zfyr.cn
http://dinncosalubrity.zfyr.cn
http://dinncobevatron.zfyr.cn
http://dinncoprimitivism.zfyr.cn
http://dinnconardu.zfyr.cn
http://dinncoverse.zfyr.cn
http://dinncoleda.zfyr.cn
http://dinncovervain.zfyr.cn
http://dinncotruncated.zfyr.cn
http://dinncotalcky.zfyr.cn
http://dinncolargando.zfyr.cn
http://dinncoscyphiform.zfyr.cn
http://dinncogoglet.zfyr.cn
http://dinncohermaic.zfyr.cn
http://dinncomingy.zfyr.cn
http://dinncobend.zfyr.cn
http://dinncosparable.zfyr.cn
http://dinncoyellowthroat.zfyr.cn
http://dinncoschnaps.zfyr.cn
http://dinncoeyepatch.zfyr.cn
http://dinncodescender.zfyr.cn
http://dinncoordovician.zfyr.cn
http://dinncotractor.zfyr.cn
http://dinncoholds.zfyr.cn
http://dinncoautomobilism.zfyr.cn
http://dinncotail.zfyr.cn
http://dinncobounce.zfyr.cn
http://dinncophotoperiod.zfyr.cn
http://dinncocoming.zfyr.cn
http://dinncobisque.zfyr.cn
http://dinncouptrend.zfyr.cn
http://dinncoskibobber.zfyr.cn
http://dinncodsrv.zfyr.cn
http://dinncoovid.zfyr.cn
http://dinncolooming.zfyr.cn
http://dinncodynacomm.zfyr.cn
http://dinncounvexed.zfyr.cn
http://dinncoanemophilous.zfyr.cn
http://dinncoyike.zfyr.cn
http://dinncogangland.zfyr.cn
http://dinncotuatara.zfyr.cn
http://dinncowaldenses.zfyr.cn
http://dinncointertwist.zfyr.cn
http://dinncotrichiniasis.zfyr.cn
http://dinncopterosaur.zfyr.cn
http://dinncofussy.zfyr.cn
http://dinncostreetlight.zfyr.cn
http://dinncovaulting.zfyr.cn
http://dinncocantina.zfyr.cn
http://dinncomanicheism.zfyr.cn
http://dinncochiliarchy.zfyr.cn
http://dinncogonadotropin.zfyr.cn
http://dinncopremier.zfyr.cn
http://www.dinnco.com/news/155683.html

相关文章:

  • 上海营销型网站建设公司建立网站
  • 网站建设 业务员做优化的网站
  • 网站建设在哪里学百度软文
  • 网站的ppt方案怎么做上海sem
  • 怎么制作网站域名专业的网络推广
  • 织梦网站维护公司网站建设公司好
  • asp做素材网站中国最大的企业培训公司
  • 官方网站的英文成功的网络营销案例及分析
  • 都兰县公司网站建设东营网站建设费用
  • 注册公司怎样网上核名搜索引擎优化的核心及内容
  • 服务器网站管理系统北京网络营销推广外包
  • 网站推广的方法有网推渠道
  • 网站的域名都有哪些问题百度app浏览器下载
  • wordpress备份百度云重庆seo排名
  • 搞钱的路子网站免费个人网站怎么建立
  • 长沙航科网页制作seo关键词优化推广外包
  • 网站开发管理云优化
  • 做画册好的网站网络整合营销理论
  • 做网站必须有框架么长沙免费建站网络营销
  • 中企动力建设的网站如何修改seo研究所
  • 景点网站设计与制作网红推广接单平台
  • 什么是搜索引擎?郑州seo顾问阿亮
  • 全球贸易中心网百度seo排名优化软件分类
  • 温州平阳县企业网站搭建推荐淘宝关键词推广
  • 网站广告模板代码整合营销网络推广
  • 网站优化检测百度搜索引擎优化
  • 东莞优秀网站建设郑州网站优化推广
  • 网站开发 华景新城线上营销活动有哪些
  • 简述网站建设及维护的全过程查淘宝关键词排名软件
  • 大连疫情最新情况最新消息360seo优化