`
yjian84
  • 浏览: 39974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

0001

阅读更多
hashMap  源码 简单解析。


public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
{

    /**
     * The default initial capacity - MUST be a power of two.
     *2的次方 必须是 默认初始化的大小 是16
     */
    static final int DEFAULT_INITIAL_CAPACITY = 16;

    /**
     * The maximum capacity, used if a higher value is implicitly specified
     * by either of the constructors with arguments.
     * MUST be a power of two <= 1<<30.
     *左移位   最大值  1<<30 = 1 073 741 824  2 的30次方
     *2<<3  2*2的3次方 
     */
    static final int MAXIMUM_CAPACITY = 1 << 30;

    /**
     * The load factor used when none specified in constructor.
     *默认负载因子 (当没有指定负载因子时 采用默认的)
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

    /**
     * The table, resized as necessary. Length MUST Always be a power of two.
     *数组的长度必须为2 的次幂
     */
    transient Entry[] table;

    /**
     * The number of key-value mappings contained in this map.
     */
    transient int size;

    /**
     * The next size value at which to resize (capacity * load factor).
     * 数组扩容时的长度是根据负载因子和默认长度计算出来的  eg:默认loadFactor = 0.75 ,catacity = 16 则当数组容量超过12时就进行扩容
     *容量为capacity 的2倍 即2的次幂。
     * @serial
     */
    int threshold;

    /**
     * The load factor for the hash table.
     *为数组准备的负载因子 可以自定义大小
     * @serial
     */
    final float loadFactor;

    /**
     * The number of times this HashMap has been structurally modified
     * Structural modifications are those that change the number of mappings in
     * the HashMap or otherwise modify its internal structure (e.g.,
     * rehash).  This field is used to make iterators on Collection-views of
     * the HashMap fail-fast.  (See ConcurrentModificationException).
     *记录hashMap 被修改的次数,每次都是加一操作。
     */
    transient volatile int modCount;




//静态类 用来存放参数
    static class Entry<K,V> implements Map.Entry<K,V> {
        final K key; ----key存放键值
        V value;  ----存放键
        Entry<K,V> next; 指向下一个对象,用来当位置重复时做链表用
        final int hash; ----存放hash 值, 这里不是hashcode 是 通过hashmap的hash算法得到的hash值 但是是和hashcode有关
        如果hashcode相等,则此值也是相同的

        /**


    /**
     * Offloaded version of put for null keys
     */
    private V putForNullKey(V value) {
    /×××
    key==null时调用
   
   
   
    ××/
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {//在0索引位置开始向后循环查找查找  注意next 链表结构
        //如果这个地方有null  的key 则替换掉,否则调用下面的方法
        //注意:null的key 都是存储在0索引位置的,即table数组的第一位如果有链表则向下连
            if (e.key == null) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(0, null, value, 0);//这个方法是存储null 的key的
       
        return null;
    }


    /**
     * Adds a new entry with the specified key, value and hash code to
     * the specified bucket.  It is the responsibility of this
     * method to resize the table if appropriate.
     *
     * Subclass overrides this to alter the behavior of put method.
     */
    void addEntry(int hash, K key, V value, int bucketIndex) {
    //buckectIndex 是要存放value值在数组中的位置。
    //首先把backetIndex位置的数取出来,指向e
Entry<K,V> e = table[bucketIndex];

将backetIndex 位置存入新的entry 对象,此对象把原先的entry对象放到了next里
根据最近使用的数据在不远的将来还会在使用的原则,把新的entry对象放到了此处索引位置的最上面,以前的老的entry对象向下链接。
        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
        判断数组的长度如果超出了threshold= capacity*loadFactory  16*0.75 如果超过或者相等就会扩容数组为原来的2倍
        if (size++ >= threshold)
            resize(2 * table.length);
    }

    /**
     * Associates the specified value with the specified key in this map.
     * If the map previously contained a mapping for the key, the old
     * value is replaced.
     *如果map里有key(通过e.hash == hash && ((k = e.key) == key || key.equals(k)) 判断的) 则用新值替换老的值,并把oldvalue返回
     *
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return the previous value associated with <tt>key</tt>, or
     *         <tt>null</tt> if there was no mapping for <tt>key</tt>.
     *         (A <tt>null</tt> return can also indicate that the map
     *         previously associated <tt>null</tt> with <tt>key</tt>.)
     *上面的一段大体意思是 key 关联指定的value 。或者value去关联指定的key
     */
    public V put(K key, V value) {
        if (key == null)
        /××
       
        先说说key==null吧
        如果key==null  调用putFor NUllKey 方法 参数为value
       
       
       
        ×××/
            return putForNullKey(value);
           
           
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
       
        //判断此位置的链表上是否有这个key,如果有 则替换没有就调用add方法添加
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        //此处和上面是一样的,记住entry对象里存了hash值,key,value,和数组的索引位置
        addEntry(hash, key, value, i);
        return null;
    }





















































0
6
分享到:
评论

相关推荐

    Vendor_0001_Product_0001.kl 文件的键值功能定义详解

    `Vendor_0001_Product_0001.kl`文件是定义遥控器按键功能的关键配置文件,它位于`\system\usr\keylayout`目录下。这个文件的作用是将遥控器发送的键值(Key Values)映射到相应的操作或功能,从而实现对设备的控制。...

    基于BISS0001 的雷达微波感应电路设计含有原理图及pcb

    标题中的“基于BISS0001的雷达微波感应电路设计”是一个关于电子工程的项目,其中BISS0001是一款常见的雷达传感器芯片,主要用于微波感应应用。这种感应器广泛应用于智能家居、自动门控、人体检测等多个领域。BISS...

    T62M0001A数字混响IC

    ### T62M0001A数字混响IC知识点详解 #### 一、产品概述 T62M0001A是一款采用CMOS技术的数字混响处理器芯片,由TM Technology Inc.研发制造。该芯片具备低噪声、低失真等特性,并内置64K SRAM存储器,支持两种控制...

    基于FTHR-G0001开发板的简易温湿度计,本文只是简单的应用示例,有兴趣的朋友可以参考

    【标题】中的“基于FTHR-G0001开发板的简易温湿度计”表明了这是一个使用特定硬件平台设计的简单环境监测设备。FTHR-G0001开发板是嵌入式系统的一种,通常用于原型设计和实验,它可能集成了微控制器和其他外围设备,...

    BISS0001人体红外感应开关模块ALTIUM设计硬件原理图PCB+AD集成封装库.zip

    BISS0001人体红外感应开关模块ALTIUM设计硬件原理图PCB+AD集成封装库,2层板设计,Altium Designer 设计的工程文件,包括完整的原理图及PCB文件,可以用Altium(AD)软件打开或修改,可作为你产品设计的参考。...

    ring_环形计数器_4’b0001_4’b0001_

    在给定的“ring_环形计数器_4’b0001_4’b0001”主题中,我们关注的是一个具有特定初始状态和位宽的环形计数器。 首先,我们要理解4’b0001这个表示法。这里的'b代表二进制,4’b0001意味着一个四位二进制数,其值...

    T62M0001 混响 卡拉OK 源代码

    T62M0001 混响 卡拉OK 源代码是专门为实现这一功能而设计的,它基于STM32F1微控制器,提供了一种简化的解决方案。 STM32F1系列是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M3内核的微控制器,具有...

    TBCAT 0001-2021 北京市安装工程标识标准.pdf

    ### TBCAT 0001-2021 北京市安装工程标识标准解析 #### 一、概述 TBCAT 0001-2021《北京市安装工程标识标准》是由北京市建筑业联合会发布的一项团体标准,旨在规范北京市机电安装工程中的设备、管线、阀门及部件...

    海信电视刷机数据 LED32K3100(0001)BOM2通用LED32K3100(0001)BOM2 生产用软件数据 强制刷机

    编号:LED32K3100(0001)BOM2_C007 方案:MTK5507 版本号:G1124 U盘升级方法 自动升级:正常开机后,将升级文件文件TargetHis拷贝到到U盘根目录,将U盘插到电视机下面的USB接口,会提示检测到新版本按确认后可以...

    Port_#0010.Hub_#0001 (标准 MTP 设备) 该设备无法启动。 (代码 10) {操作失败}解决方法

    解决 Port_#0010.Hub_#0001 (标准 MTP 设备) 无法启动的问题 Port_#0010.Hub_#0001 是一个标准的 MTP 设备,但是在某些情况下,该设备无法启动,导致无法正常工作。这种情况下,系统会提示“代码 10”错误信息,...

    BISS0001.PDF

    ### BISS0001红外传感信号处理器:深入解析与应用 #### CMOS数模混合集成电路的创新设计 BISS0001是一款由上海京西电子信息系统有限公司研发的高性能红外传感信号处理器,其核心优势在于采用了先进的CMOS数模混合...

    BISS0001.pdf

    BISS0001是一款高性能的传感信号处理集成电路,专为与热释电红外传感器配合使用而设计,广泛应用于各类红外感应控制领域。它通过匹配热释电红外传感器和一些外部元器件,实现被动式的热释电红外开关功能,适用于多种...

    《JIS B0001-2000机械制图》日本标准

    《JIS B0001-2000机械制图》是日本工业标准(Japanese Industrial Standards, JIS)中的一个重要部分,主要规定了机械制图的基本规则和技术要求。对于那些需要解读或制作日本机械图纸的技术人员来说,掌握这一标准至关...

    Biss0001的原理与使用

    BISS0001红外传感信号处理器 概述与特点 BISS0001 红外传感信号处理器集成电路。 该电路的特点如下:1. CMOS 数模混合 2. 具有独立的高输入阻抗运算放大器,可与多种传感器匹配,进行信号预处理 3. 双向鉴幅器...

    红外热释电处理芯片BISS0001应用资料

    红外热释电处理芯片 BISS0001 应用资料 知识点1:红外热释电处理芯片 BISS0001 的概述 BISS0001 是一款高性能的传感信号处理集成电路,静态电流极小,配以热释电红外传感器和少量外围元器件即可构成被动式的热释电...

    MCGSE 7.2(09.0001)完整安装包.zip

    MCGS 7.2(09.0001)是该系统的特定版本,提供了全面的功能升级和性能优化,适用于各种工控环境,尤其对于北京昆仑通态公司的触摸屏产品有着良好的兼容性。 一、MCGS系统概述 MCGS人机界面系统是一个集数据采集、控制...

    UpgradeDownload_R0.0.0001.7z

    "UpgradeDownload_R0.0.0001.7z" 可能是展讯推出的一个固件升级或下载工具,用于帮助用户更新或下载与展讯芯片相关的软件。7z格式是一种高效的数据压缩格式,它提供了比常见的ZIP格式更高的压缩率。 这个工具可能...

Global site tag (gtag.js) - Google Analytics