7x24小时售后服务
5倍故障时长赔付
15天无理由退款
N对一管家服务
让我们的顾问联系您
ok,HashMap可以接受null键值和值,HashTable不能;HashMap是非synchronized;HashMap很快,HashMap存储的是键值对。。。balabala。。。(算不菜,知道点东西)
接下来,面试官会接着说:
HashMap是基于hashing的原理,使用put(key,value)存储对象到HashMap中,然后使用get(key)从HashMap中获取对象。
put()方法传递参数,即键key和值value。我们首先调用hashCode方法,返回的hashCode用于找到数组中bucket的位置来存储Entry对象(注意bucket存的不仅仅是值)。
面试官进一步问:
啊哈~无脑说,碰撞就抛出异常呗!再或者我不存储了!可以吗?
听到这样的回答,怎么说,也是解决方法吧,不算错。面试官接着给你个tip
即使两个对象的hashCode相同,但是他们可能并不相等(不是同一个对象)啊。hashCode相同只能说明他们的bucket位置相同,“碰撞”会发生。但是,HashMap使用链表存储对象,此刻的Entry(包含键值对的Map.Entry对象)是可以存储在链表中的。
差不多写入HashMap的就问的差不多了,来吧,下一步。
调用get()方法,使用键对象的hashCode找到bucket位置(如果没有链表就可以直接输出值对象了),接着遍历链表直到找到这个对象。
仔细分析,遍历链表的话,是不是先要知道一个值对象,然后在去遍历找到这个对象。这不是那个啥嘛,你都知道了这个对象了,那你遍历找个啥子,多此一举。
正确答案:找到bucket位置后,调用keys.equals()方法去找到正确的节点,最终找到要找的对象。(千万不要把hashCode()和equals()搞混了)。一些优秀的开发者会指出使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择。
HashMap就这样完了?啧啧!单纯。。。
好了,不拐弯抹角了。默认的负载因子是0.75。当一个map填充超过75%的时候,HashMap会扩容到两倍的bucket数组。把原来的对象放入bucket数组里,此过程叫rehashing。
大白话,条件竞争。那么什么是条件竞争?
举个栗子:扩容过程需要把源数据依次拿出来(HahMap中的链表中插入删除节点都是头部进行操作)。所以在多线程下,某两个线程都要将某一个HashMap扩容,它们会同时试着调整大小,扩容过程中存储在链表中元素次序会反过来。如果条件竞争发生了,那么就进入死循环了。
写个总结:
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
本文是成都网站建设公司、成都网站设计制作公司、成都APP开发公司、成都响应式网站建设、成都VR全景制作-桔子科技公司为您整理!
成都网站建设,成都网站设计,成都网站制作,成都网页设计,成都网站建设公司 ,成都网站设计公司,成都网站制作公司,成都网页设计公司,网站建设、网站制作、网站设计、网页设计、成都响应式网站建设、成都响应式网站制作、成都响应式网站开发、成都全景制作、成都VR全景制作、成都手机网站建设,手机网站建设,成都APP开发,APP开发,成都建网站,成都做网站,成都商城网站建设,集团网站建设,网站建设,高端网站建设,品牌网站建设,成都平台网站建设,成都响应式网站建设,成都微信网站建设,成都微商城网站建设,成都微信营销,成都微信小程序开发、成都网站优化,成都网络公司。
7x24小时售后服务
5倍故障时长赔付
15天无理由退款
N对一管家服务
让我们的顾问联系您
川公网安备 51010502010278号
ICP备案号:蜀ICP备10206569号-2