返回

开源软件

搜索 导航

集合---03---HashMap源码分析

发布于: 2016-34-10   作者:知行133   来源:转载   浏览:
 1、HashMap概述

  HashMap基于哈希表的 Map 接口的实现、 null 值和 null 键、不是线程安全的(Collections类的静态方法synchronizedMap获得线程安全的HashMap)。

  
  2、HashMap的数据结构
       数组+链表(entry) 相当与一个entry[]数组、entry含有key/value/next/hash属性
 
  3、源码分析
         《1》 加载因子(0.75) 
         《2》 threshold: 加载因子*容量,超过该临界值就要扩容,以2*容量进行扩容(hash(key)&(length-1)), hash(key)&(length-1),如果length是奇数的话,就会浪费掉一一半的空间
         《3》 存储数据:put<key,value>
                   1》key为null,存储到entry[0]中
                   2》key不为null, 索引 i=hash(key)&(length-1)  (这样提高性能)
                         根据i获得entry[i],判断entry[i]的hash值、key值与key的hash值、值是否相同
                           a.  相同的话,就把value代替oldvalue
                           b. 不同的话就把value插入到头结点后面     
                    读取数据:get<key>
                          首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在 对应位置的链表中找到需要的元素
区别
hashMap
hashTable
conCourrentHashMap
存储null键 null键的值存储在entry[0]中 不可以存储
hashmap线程安全版
安全
不安全,可以通过collections类的静态方法snchronizedMap使它安全
安全,实现了snchronized
代码块锁ReentrantLock;
多段(Segmemt),每段就是一个hashtable(默认16段)
怎样存储
hash(key)&(length-1) ,
这也是扩容时为什么是2倍的进行扩容的原因了

hash(key)%(length)

同hashMap
 实现
map接口实现
Dictionary类  
hashMap

  • 0

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

line
IT610手机版