今天看HashMap的底层实现,发现HashMap的最大容量规定为: // 最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) static final int MAXIMUM_CAPACITY = 1 << 30; 当看到 1<<30 时,对“<<” 有点模糊,当了解“<<”的用法之后,又有一个问题: int类型不是4个字节共32位吗,为什么不是 1<<31呢? 首先介绍下等号右边数字及字符的含义: 1."<…
123456观察jdk中HashMap的源码,我们知道极限值为2的31次方. void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE;//将threshold置为Integer.MAX_VALUE return;//当HashMap的…
HashMap为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法: 这个算法实际就是取模,hash%length,计算机中直接求余效率不如位移运算,源码中做了优化hash&(length-1), hash%length==hash&(length-1)的前提是length是2的n次方: 为什么这样能均匀分布减少碰撞呢?2的n次方实际就是1后面n个0,2的n次方-1  实际就是n个1: 例如长度为9时候,3&(9-1)…
个人理解 做下记录,不正确的地方望不吝赐教 这是hashmap初始化容量时候 对容量大小做的处理,保证初始化容量为最近的2的幂次方(JDK1.8) static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为null,在安卓中如果数据量比较小(小于一千),建议使用SparseArray和ArrayMap,内存,查找性能方面会有提升,如果数据量比较大,几万,甚至几十万以上还是使用HashMap吧.本篇只详细分析HashMap的源码,SparseArray和ArrayMap不在本篇讨论范围内,后续会单独分析…
前言 之前周会技术分享,一位同事讲解了HashMap的源码,涉及到一些常量设计的目的,本文将谈谈这些常量为何这样设计,希望大家有所收获. HashMap默认初始化大小为什么是1 << 4(16) /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; HashMap默认初始化大小为什么是16,这里分两个维度分…
HashMap类的申明 HashMap的定义如下: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {} HashMap是一个散列表,用于存储key-value形式的键值对. 从源码的定义中可以看到HashMap继承了AbstractMap抽象类而且也实现了Map<K,V>接口,AbstractMap类本身也继承了M…
HashMap简介 HashMap是开发中使用频率最高的用于映射(键值对 key value)处理的数据结构,我们经常把hashMap数据结构叫做散列链表: ObjectI entry<Key,Value>,entry<Key,Value>] 可以将数据通过键值对形式存起来 特点 HashMap根据键的hashcode值存储数据,大多数情况可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序是不确定的    想要使得遍历的顺序就是插入的顺序,可以使用LinkedHashMap,…
去面试时,hashmap总是被经常问的问题,下面总结了几道关于hashmap的问题. 1.hashmap的主要参数都有哪些? 2.hashmap的数据结构是什么样子的?自己如何实现一个hashmap? 3.hash计算规则是什么? 4.说说hashmap的存取过程? 5.说说hashmap如何处理碰撞的,或者说说它的扩容? 解答:以1.7为例,也会掺杂一些1.8的不同点. 1. 1)桶(capacity)容量,即数组长度:DEFAULT_INITIAL_CAPACITY=1<<4:默认值为16…
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 这是上篇文章 有趣的条漫版 HashMap,25岁大爷都能看懂 的文字版.有不少同学说条漫版的比较有意思,简单易懂,但是毕竟图片画不了那么详细,只能从大面而上理解. 真正的了解细节,还得看这一篇.其实是这篇先写完,然后画了不少图片,所以就写了一篇图片版的.本篇 7000 多字,建议三连呦.…