JAVA关于HashMap浅谈

      HashMap是在底层运用了hashtable技术来对key-value的键值对数据进行存储,其中以key作为哈希索引,故而key是不允许"相

同"的,但是可以把null作为key值。

    HashMap有个内部类Entry,其key-value键值对就是保存在Entry内部中。

    首先,咱们先上图来看看HashMap的概念结构图:

    

图1

    如图1,这是一个长度为7的hash表,每个hash槽内都只能储存一个Entry对象,Entry对象内有一个Entry<K,V> next对象指向下一

个Entry,即形成Entry单链表,每个Entry链表的第一个元素保存与hash表槽内。

    对于put()函数存储键值对过程:

    给出key-value的值,put(key,value),首先会对key进行处理;

    1.得到key的hashCode()值;

    2.根据该hashcode值通过hash()函数,计算该key的hash值;

    3.根据该hash值找到在hash表中的hash槽位置;

    4.取出该hash槽中的Entry对象,比较key与所取出的Entry对象内的key-- a.如果两者的hashcode值相同,则继续比较两者的

equals()值,如果equals()也相同,表示为同一个key,把最新value值覆盖该Entry内的value值;如果equals()不同,则表示不同的key; b.如果hashcode()值不同,表示不同的key;

    5.如果是不同的key,则根据当前Entry的next继续寻找当前hash槽的Entry链表的下一个Entry对象,继续重复4步骤;

    6.如果直到链表末端都没有覆盖key-value值,则新建一个Entry对象,保存最新key-value值,然后,把该对象插入的当前链表的

表头,即替换hash表槽中的Entry;如在图1中,Entry6作为最新的Entry插入时,next指向链表表头元素,然后,替换掉Entry1。

    对于get()函数查找元素过程:

    跟存储的过程一样,找到对应的Entry后,直接取出value值即可。

    因此,hashMap是根据key的hashCode()和equals()函数共同来处理判断是否是两个一样的key,主要根据hashCode,当hashcode

一致的时候,再判断equals()。

    注:关于hashCode()与equals()函数。一般来讲,两者并无多大联系,因为都是可以自定义的;对于像String,Integer等类,

hashCode()是与其内容有关,内容一样,hashcode就一样,像Integer是直接返回其value作为hashcode;对于Object类,默认的

hashCode()是native方法,与其对象地址有关;当我们在需要建立对象作为hash索引键的时候,一定要覆写这两个函数,并且最好

保证当hashcode不一样,则就是两个不同对象;hashcode一样,equals可以一样也可以不一样,但是当equals一样,表示同一个对象

   ps: hashSet内部就是调用了hashMap,直接通过hashMap的key作为hashSet的元素处理对象。

   参考文献:ImportNew参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值