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

读了HashMap源码的感受

    博客分类:
  • java
 
阅读更多
今天读了java.util.HashMap的源码,记录几点感受。起因是想知道,HashMap是如何实现的,最大可以容纳多少键值对。因为HashMap实现了Map接口,而Map接口扩展自Collection接口,所以HashMap也实现了size方法。size方法的返回值是int型的,所以,最多就能返回Integer.MAX_VALUE个结果。但是,并不意味着HashMap只能容纳这么多。这就涉及到HashMap是如何实现的。

HashMap内部有一个Entry的数组,就是所谓的bucket。每个bucket都是一个链表。链表中的元素就是键值对Entry。所以,理论上说HashMap可以容纳无限的键值对。但是最多就只能返回Integer.MAX_VALUE个。

接下来,说一下HashMap的优缺点:
优点:get和put的操作都是常数时间。
缺点:bucket的容量是动态增加的,每次容量调整,都会把原来的元素rehash并且复制到新的数组上面去,开销不小。

size,capacity,threshold,loadFactor之间的关系:
size是键值对的个数
capacity是buckets的个数
loadFactor是个参数,描述buckets的充满程度
threshold等于capacity*loadFactor,是一个阀值。如果size超过了它就要增加capacity(变为原来的2倍),并且rehash。

rehash的细节:
先创建一个长度为新长度的Entry数组作为buckets,然后,用它的长度rehash原来buckets中的所有Entry,并把Entry插入到新的buckets中。注意是插入而不是append到相应的bucket中:如果该bucket中已有Entry,就插入到那个entry的前面。

与Hashtable的区别:
HashMap是非线程安全的,而Hashtable是线程安全的
HashMap的key和value可以是null,而Hashtable不能接受null为key(null value待确认)

那么null的键hash到哪个bucket呢?就是指定bucket[0].

明天读下,Hashtable的源码。
分享到:
评论

相关推荐

    HashMap源码深度剖析.md

    HashMap源码深度剖析,面试必备

    HashMap源码(JDK1.7,含注释)

    HashMap源码(JDK1.7,含注释)

    HashMap源码(上)

    HashMap的部分源码解析

    1.6 hashmap源码

    hashmap源码,可以看看http://blog.csdn.net/wabiaozia/article/details/50684556

    JDK7HashMap源码

    精确的版本号是jdk-7u80。想不通,竟然很多人都收费,这个明明可以在安装JDK的目录中找到啊!自己下一个JDK就可以得到。

    HashMap源码流程图

    HashMap源码流程图 一图解析HashMap源码流程 // 默认的HashMap中数组的长度 16 static final int DEFAULT_INITIAL_CAPACITY = 1 ; // aka 16 // HashMap中的数组的最大容量 static final int MAXIMUM_CAPACITY = 1 ...

    JDK8HashMap源码

    精确的版本号是jdk-8u181。想不通,竟然很多人都收费,这个明明可以在安装JDK的目录中找到啊!自己下一个JDK就可以得到。

    HashMap源码分析

    HashMap 是 Java 中最常用的集合类之一,它是基于哈希表实现的,提供了高效的数据存取功能。HashMap 的核心原理是将键(key)通过哈希函数转化为数组索引,然后将键值对(key-value pair)存储在数组的对应位置。...

    hashMap1.8源码

    下面我们将深入探讨HashMap的源码,特别是关于`put`和`get`操作的实现细节。 HashMap的核心数据结构是一个数组配合链表/红黑树的数据结构。数组中的每个元素是一个Node对象,Node包含键、值、哈希码以及指向下一个...

    HashMap之resize()方法源码解读.docx

    HashMap之resize()方法源码解读 HashMap的resize()方法是HashMap中最核心的方法之一,该方法负责扩容HashMap的容量,以便存储更多的键值对。下面我们将对HashMap的resize()方法进行源码解读,了解其扩容机制和原理...

    HashMap源码剖析共10页.pdf.zip

    《HashMap源码剖析》 HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,提供了键值对(Key-Value)的存储方式。HashMap在内部使用了一个数组和链表来实现,实现了快速的查找、插入和删除...

    手写HashMap源码.rar

    《手写HashMap源码解析——深入理解数据结构与算法》 HashMap是Java编程语言中一个常用的集合类,它提供了一种高效、灵活的键值对存储方式。在面试过程中,尤其是2020年及以后的技术面试中,深入理解HashMap的实现...

    面试必考之HashMap源码分析与实现

    面试中,HashMap的源码分析与实现是一个常见的考察点,因为它涉及到数据结构、并发处理和性能优化等多个核心领域。本篇文章将深入探讨HashMap的内部工作原理、关键特性以及其在实际应用中的考量因素。 HashMap基于...

    java7hashmap源码-java:Java

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

    HashMap源码实现红黑树添加元素和删除元素

    HashMap 源码实现红黑树添加元素和删除元素 HashMap 中使用红黑树来存储元素,是为了提高查找、插入和删除操作的性能。红黑树是一种自平衡二叉树,可以保持二叉树的平衡,从而获得较高的查找性能。 红黑树的创建...

    1.面试必考之HashMap源码分析与实现 伸缩性角度看HashMap的不足

    1.面试必考之HashMap源码分析与实现 伸缩性角度看HashMap的不足

Global site tag (gtag.js) - Google Analytics