如何理解 ListT和 DictionaryK,V 的扩容机制 ?
咨询区
Royi Namir
为什么 List
是按照 2倍
扩容。
private void EnsureCapacity(int min)
{if (this._items.Length < min){int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);if (num < min){num = min;}this.Capacity = num;}
}
而 Dictionary<K,V>
是按 素数
扩容。
private void Resize()
{int prime = HashHelpers.GetPrime(this.count * 2);int[] numArray = new int[prime];for (int i = 0; i < numArray.Length; i++){numArray[i] = -1;}Entry<TKey, TValue>[] destinationArray = new Entry<TKey, TValue>[prime];Array.Copy(this.entries, 0, destinationArray, 0, this.count);for (int j = 0; j < this.count; j++){int index = destinationArray[j].hashCode % prime;destinationArray[j].next = numArray[index];numArray[index] = j;}this.buckets = numArray;this.entries = destinationArray;
}
为什么不都按照 2倍
来呢?这样还可以实现代码复用。
回答区
Gman
Dictionary
是启发式的,它需要保证 hashcode
必须准均匀的分布在各个桶中,.NET 的 Dictionary
采用的是素数来实现这个均衡,下面是计算桶索引的算法。
int num = this.comparer.GetHashCode(key) & 2147483647; // make hash code positive
// get the remainder from division - that's our bucket index
int num2 = this.buckets[num % ((int)this.buckets.Length)];
不过 Java 采用的和 .NET 中的 List 是一样的扩容机制。
resize(2 * table.length);
在翻倍之后,java 会重新计算 hashcode 值的。
static int hash(int h) {// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {return h & (length-1);
}// from put() method
int hash = hash(key.hashCode()); // get modified hash
int i = indexFor(hash, table.length); // trim the hash to the bucket count
List 不是启发式的,所以没有这么烦恼,
点评区
其实说到底,Dictionary采用素数,本质目的就是减少桶挂链,减少hashcode冲突,如果挂链过长,那就达不到 Contains,Add,Get 等操作的 O(1)
时间复杂度,这也就失去了 Dictionary 原本的特性。
如何理解 ListT和 DictionaryK,V 的扩容机制 ?相关推荐
- transformer注意力机制的理解(Q,K,V,dk)
Attention公式: 上面这个注意力公式可以理解为是算 V 的加权后的表示 权重就是V前面的所有部分, 其中 softmax 可以使得权重概率分布和为1. 其中 算的就是注意力的原始分数(其实也 ...
- hashmap 扩容是元素还是数组_HashMap的扩容机制---resize()
面试的时候闻到了Hashmap的扩容机制,之前只看到了Hasmap的实现机制,补一下基础知识,讲的非常好 原文链接: Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复 ...
- Java8 HashMap 扩容机制与线程安全分析
如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法. 这篇文章不对 HashMap 中的树进行介绍. 一.Ha ...
- 阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制
摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型. 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化, ...
- hashmap扩容机制_图文并茂:HashMap经典详解!
点击上方 Java后端,选择 设为星标 优质文章,及时送达 代码中的注解多看几遍,其中HashMap的扩容机制是要必懂知识!结合图片一起理解! 什么是 HashMap? HashMap 是基于哈希表的 ...
- arraylist 的扩容机制_ArrayList详解
作者丨HUC南枫 来源丨甲哇技术栈(jiawa1024)ArrayList 的底层是数组队列,相当于动态数组.与 Java 中的数组相比,它的容量能动态增长.在添加大量元素前,应用程序可以使用ensu ...
- hashmap扩容机制_图文并茂,HashMap经典详解!
Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:feigeswjtu 来源:https://github.com/feigeswjtu/java-basics ...
- 认真学习jdk1.8下ConcurrentHashMap的扩容机制
关联博文: 认真学习jdk1.7下ConcurrentHashMap的实现原理 认真学习jdk1.8下ConcurrentHashMap的实现原理 认真学习jdk1.8下ConcurrentHashM ...
- 七、JDK1.7中HashMap扩容机制
导读 前面文章一.深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二.Jdk1.7和1.8中HashMap数据结构及源码分析 .三.JDK1.7和1.8Hash ...
最新文章
- opennre 中文关系抽取_OpenNRE 2.0:可一键运行的开源关系抽取工具包
- 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
- 全局变量、静态全局变量、静态局部变量和局部变量的区别
- php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例
- wifi 2.4GHz和5GHz范围
- Unity3D(一) 操作界面及游戏常识
- Fiddler抓包教程 ---> Fiddler如何证书配置与开启抓包完整详解
- win7计算机自动关机设置在哪里设置方法,win7系统怎么设置每天自动关机|win7创建定时关机计划的方法...
- python父亲节礼物送什么_父亲节送什么礼物好
- 2020年部编人教版小学一年级语文(上册)全部知识点汇总
- 鸿蒙系统手机2020,2020年正式到来,国产手机系统最有希望的华为鸿蒙咋没消息了?...
- 女子发现前夫外遇索要2000万
- 大龄打工程序员的出路在哪里?
- Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)
- 不再热衷南下打工!中国农村正在巨变,又一浪潮滚滚席卷而来
- EVO 轨迹误差分析
- 网络存储服务器拷贝文件夹,【群晖 DS218+ 2盘位 NAS网络存储服务器使用总结】配置|做工|指示灯|copy键_摘要频道_什么值得买...
- 《HBase 不睡觉》第一章 - 初识 HBase
- MTK lcm调试总结及解决思路
- ch454c语言程序实例,CSDN18luck手机客户端下载 -IT新利18官网登录 大本营
热门文章
- VMware——安装CentOS
- LINUX - /etc/init.d/nginx: line 51: kill: (29833) - No such process
- Redis调用及使用
- [HTML5]3D标签云
- Codeforces Round #174 (Div. 2) Cows and Primitive Roots(数论)
- Asp.Net+Jquery.Ajax详解5-$.getScript
- Pgbouncer 介绍
- Android推送通知指南(转)
- Sharepoint Designer 2007 Workflow
- DotNetMagic 5.4.0破解