咨询区

  • 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 的扩容机制 ?相关推荐

  1. transformer注意力机制的理解(Q,K,V,dk)

    Attention公式: 上面这个注意力公式可以理解为是算 V 的加权后的表示 权重就是V前面的所有部分, 其中 softmax 可以使得权重概率分布和为1. 其中  算的就是注意力的原始分数(其实也 ...

  2. hashmap 扩容是元素还是数组_HashMap的扩容机制---resize()

    面试的时候闻到了Hashmap的扩容机制,之前只看到了Hasmap的实现机制,补一下基础知识,讲的非常好 原文链接: Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复 ...

  3. Java8 HashMap 扩容机制与线程安全分析

    如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法. 这篇文章不对 HashMap 中的树进行介绍. 一.Ha ...

  4. 阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制

    摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型. 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化, ...

  5. hashmap扩容机制_图文并茂:HashMap经典详解!

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 代码中的注解多看几遍,其中HashMap的扩容机制是要必懂知识!结合图片一起理解! 什么是 HashMap? HashMap 是基于哈希表的 ...

  6. arraylist 的扩容机制_ArrayList详解

    作者丨HUC南枫 来源丨甲哇技术栈(jiawa1024)ArrayList 的底层是数组队列,相当于动态数组.与 Java 中的数组相比,它的容量能动态增长.在添加大量元素前,应用程序可以使用ensu ...

  7. hashmap扩容机制_图文并茂,HashMap经典详解!

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:feigeswjtu 来源:https://github.com/feigeswjtu/java-basics ...

  8. 认真学习jdk1.8下ConcurrentHashMap的扩容机制

    关联博文: 认真学习jdk1.7下ConcurrentHashMap的实现原理 认真学习jdk1.8下ConcurrentHashMap的实现原理 认真学习jdk1.8下ConcurrentHashM ...

  9. 七、JDK1.7中HashMap扩容机制

    导读 前面文章一.深入理解-Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍,上两篇文章二.Jdk1.7和1.8中HashMap数据结构及源码分析 .三.JDK1.7和1.8Hash ...

最新文章

  1. opennre 中文关系抽取_OpenNRE 2.0:可一键运行的开源关系抽取工具包
  2. 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
  3. 全局变量、静态全局变量、静态局部变量和局部变量的区别
  4. php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例
  5. wifi 2.4GHz和5GHz范围
  6. Unity3D(一) 操作界面及游戏常识
  7. Fiddler抓包教程 ---> Fiddler如何证书配置与开启抓包完整详解
  8. win7计算机自动关机设置在哪里设置方法,win7系统怎么设置每天自动关机|win7创建定时关机计划的方法...
  9. python父亲节礼物送什么_父亲节送什么礼物好
  10. 2020年部编人教版小学一年级语文(上册)全部知识点汇总
  11. 鸿蒙系统手机2020,2020年正式到来,国产手机系统最有希望的华为鸿蒙咋没消息了?...
  12. 女子发现前夫外遇索要2000万
  13. 大龄打工程序员的出路在哪里?
  14. Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)
  15. 不再热衷南下打工!中国农村正在巨变,又一浪潮滚滚席卷而来
  16. EVO 轨迹误差分析
  17. 网络存储服务器拷贝文件夹,【群晖 DS218+ 2盘位 NAS网络存储服务器使用总结】配置|做工|指示灯|copy键_摘要频道_什么值得买...
  18. 《HBase 不睡觉》第一章 - 初识 HBase
  19. MTK lcm调试总结及解决思路
  20. ch454c语言程序实例,CSDN18luck手机客户端下载 -IT新利18官网登录 大本营

热门文章

  1. VMware——安装CentOS
  2. LINUX - /etc/init.d/nginx: line 51: kill: (29833) - No such process
  3. Redis调用及使用
  4. [HTML5]3D标签云
  5. Codeforces Round #174 (Div. 2) Cows and Primitive Roots(数论)
  6. Asp.Net+Jquery.Ajax详解5-$.getScript
  7. Pgbouncer 介绍
  8. Android推送通知指南(转)
  9. Sharepoint Designer 2007 Workflow
  10. DotNetMagic 5.4.0破解