`
woodenfish
  • 浏览: 5599 次
社区版块
存档分类
最新评论

HashMap的逻辑

    博客分类:
  • Java
 
阅读更多

在Map中key-value组合成Map.Entry对象存放,所有的Entry存放在数组table中

/**
  * The table, resized as necessary. Length MUST Always be a power of two.
 */
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

 HashMap中Entry的结构如下:

final K key;
V value;
Entry<K,V> next;
int hash;

 可以看出,相同hashCode的key会以链表的形式存放在table的同一个slot中。

 

HashMap中可以存放nullnull存放在table[0]中

/**
  * Offloaded version of put for null keys
*/
    private V putForNullKey(V value) {
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(0, null, value, 0);
        return null;
    }

 从此可以看出,在HashMap中,null只会有一个value。

 

public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        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++;
        addEntry(hash, key, value, i);
        return null;
    }

 从put方法可以看出,相同hashCode的所有key占用同一个slot,并以链表的形式存在。

 

    public V get(Object key) {
        if (key == null)
            return getForNullKey();
        Entry<K,V> entry = getEntry(key);

        return null == entry ? null : entry.getValue();
    }

    final Entry<K,V> getEntry(Object key) {
        if (size == 0) {
            return null;
        }

        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

 从get方法可以看出,如果(k = e.key) == key,即是同一个对象的引用(不管该对象是否在put后发生变化,这是通过equals方法的结果可能不同了)都会去除e.key中的e.value。否则就需要调用它们的equals方法来判断是否相同。

 

分享到:
评论

相关推荐

    HashMap的put逻辑(1.7) .svg

    HashMap的put逻辑(1.7) .svg

    HASHMap迭代集合的例子好用

    HASHMap迭代集合的例子好用,逻辑算法

    HashMap之put方法源码解读.docx

    对HashMap的put方法的源码进行详细解读,分析put方法源码中的内在逻辑关系,欣赏源码独特之美,从中学习更为精致的编程思维

    Java HashMap 如何正确遍历并删除元素的方法小结

    主要介绍了Java HashMap 如何正确遍历并删除元素的方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    java7-8中的 HashMap和ConcurrentHashMap全解析 如果你想了解底层的逻辑就来看看吧

    Java中对HashMap的深度分析

    在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键。由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题。找遍了大大小小的论坛,也把《Java 虚拟机规范...

    java7hashmap源码-java:Java

    hashmap源码 Table Of Contents day01_JAVA语言概述与基本语法:标识符、变量也变量分类、源码_反码_补码、进制转换、编码与字符集 day02_基本语法.运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下

    c语言实现哈希字典Hashmap

    做项目写业务逻辑的时候经常用到的数据结构有2个,一个是动态数组还一个是字典。大部分编程语言,都有提供上述两种数据结构的集合类标准库。但是c语言是没有提供这类标准库的,本资源提供的是一个可以在正式项目中...

    华为逻辑推理题以及编程代码题

    一些华为的逻辑思维面试题,包括一部分代码编程题。可以看啊可能

    SimpleCache:用Java实现的缓存框架,使用HashMap进行存储,你可以实现Cache和CacheFactoryStrategy来自定义你的缓存实现逻辑

    SimpleCacheA Cache framework for java and android application, objects are store in key-value pair in memory,value can be...使用HashMap进行存储,键为String,值可以为任意对象类型,如String,List,Map等。当

    哈希表类_汇编版(HashMap_ASM) 2.7版-易语言

    2.7版(2020.4.7)  1) 调整 添加() 方法. 增加可选参数 参_不覆盖 (当键值存在时不进行值覆盖) ... 1) 修复 取值的键数组 逻辑值获取失败问题。  2) 调整 长整数键的哈希计算调整为单独的方法调用,减少些汇编代码。

    java summary(java笔记)

    &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空...

    哈希表类_汇编版(HashMap_ASM) 支持自定义数据值

    1) 添加 取值时可提供一个逻辑参考参数,保存取值状态结果。2) 添加 支持自定义数据值, 以及使用范例(用法比较另类)。0.4版(2018.11.22)。1) 修复 由于WIN10下,文本比较SSE4.2会产生奔溃,屏蔽掉文本比较SSE4.2。...

    超实用的面试题整理

    · table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。 · key的hashcode()方法用来找到Entry对象所在的桶。 · 如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。 · key的...

    一个可以用于输出信息的窗口程序

    但有时并不方便停止程序调试,或有些逻辑错误不是简单的单步跟踪可以解决的。此外,还有时程序在客户的机器上,没有调试环境。再者,有时就是希望输出一些信息,来判断某些程序的状态。 我做了一个程序用消息传递...

    java7hashmap源码-lf-mkd-java-core-high-level:来自慕课大学的java核心技术(高阶),主要内容:语法糖

    hashmap源码 CoreHighLevel 课程来源: 高级特性: 换算 字节 (byte):8个二进制位为一个字节(B),最常用的单位。计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间的关系是:  1B...

    JAVA实现基于知识图谱的古诗词智能问答

    JAVA实现基于知识图谱的古诗词智能问答 使用java+ssm+springboot+maven+...8、确定问题模板后,根据对应的服务层逻辑,调用数据库连接层,去图数据库Neo4j中查找问题的答案 9、将返回结果进行处理,返回至前端输出

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    java面试题精选

    搜集整理制作成chm格式文件,灰常给力 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean...11、HashMap和Hashtable的区别。

Global site tag (gtag.js) - Google Analytics