java中的HashMap和linkedHashMap的底层实现

1>HashMap的底层实现

           a:底层的实现是散列表(数组+链表)

           b;put 操作时,首先会根据key进行hash(key)计算出在数组中的存储位置,如果该位置已经存在其他元素,将之前脸链表的数据往后推,该操作可能存在hash冲突,不同key的值,通过hash函数得到相同的index,采用链表的方式进行存储,相同key的值,得到相同的hash值,直接进行覆盖,

        c:为了减少hash冲突,尽量使用hashmap的长度设置为2的次幂

         d:在进行put操作的时候,首先会经过hash(key)计算出数据在数组中的存储索引,如果该index下只有一个元素,直接拿取返回,如果该索引下有多个元素,将该链表进行迭代,通过equals方法比较获取

      f:初始容量是16,load factor是0.75,即扩容的临界值为:16*0.75=12,在进行扩容的时候,容量会变为原来额1倍,然后会重新计算key的hash函数,在数组中重新定位,这样是非常消耗性能的,为避免这样的情况,应该尽量预知hashmap中的元素个数

  

2>linkedhashmap的底层原理:

    1>底层的数据结构(数组+双向链表)

    2>该在遍历的过程中,如果accessirder设置为true的时候,采用lru最近最少使用算法进行遍历,否则按照插入顺序进行遍历

3>hashmap和linkedhashmap的区别

     1>底层的数据结构:hashmap(数组+单链表)  linkedhashmap(数组+双向链表)

      2>在进行遍历的过程中hashmap无序,linkedhashmap可按照插入顺序进行遍历,且linkedhashmap在查找元素时候,可基于双向链表双向查找,效率更高,但是在存储上面需要浪费更多的存储空间,空间换时间的思想

   

猜你喜欢

转载自blog.csdn.net/w5201314ws6123/article/details/87909563