您的位置:首页 > 编程语言 > Java开发

JAVA关于HashMap浅谈

2015-12-15 15:31 211 查看
      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参考文献
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: