Venoman9867 Asked:2022-09-05 18:33:22 +0800 CST2022-09-05 18:33:22 +0800 CST 2022-09-05 18:33:22 +0800 CST Java中的Hashmap详细[关闭] 772 我试图弄清楚 Hashmap 设备,它是如何工作的)我会告诉你我学到了什么,如果有问题请纠正我)还有一些我不明白的事情哈希图。在讲解的过程中,我会问问题,如果你不介意,请回答)所以,一开始我们使用散列函数将键转换为散列值,然后我们计算索引,因为值哈希数可能很大并得到 OutOfMemory,这里的问题是如何链接索引和存储桶?我真的不明白它扮演什么角色。我也知道在桶中实现了一个单链表,我知道哈希码和等于它们同时重新定义以防止冲突,我也知道如果键匹配,那么旧值将被新值覆盖。为什么查找时间为 O(1)?我们是否将存储桶存储在 16 个单元的常规数组中? java 1 个回答 Voted Best Answer василина семёнова 2022-09-06T03:55:03+08:002022-09-06T03:55:03+08:00 基于散列函数,计算篮子(桶)的数量,我们放置我们的键值。在这个散列函数中,除以 16 有一个位移和一个余数,因此我们从散列码(从 0 到 15)中得到篮子的数字,当我们的数组的 0.75% 被填充时(这是 12 16 个篮子的元素),数组增加 2 倍(依此类推,直到 64,然后它重生为红黑树),再次重新计算哈希值(hash),我们的元素(节点)是重新分布在已经有 32 个单元的数组上。 为什么查找时间为 O(1)?因为我们在hashmap中有一个数组,并且通过索引在数组中的搜索是在恒定时间内发生的(因为数组是内存中的一个大对象),但是当hashmap重生为kch树时,搜索就已经是对数了. 如果发生冲突,将通过哈希码进行搜索,然后按值进行搜索,我们将失去线性速度 关于哈希图还有很多要说的。但你应该知道,这是社会保障部门的一个常见问题)
基于散列函数,计算篮子(桶)的数量,我们放置我们的键值。在这个散列函数中,除以 16 有一个位移和一个余数,因此我们从散列码(从 0 到 15)中得到篮子的数字,当我们的数组的 0.75% 被填充时(这是 12 16 个篮子的元素),数组增加 2 倍(依此类推,直到 64,然后它重生为红黑树),再次重新计算哈希值(hash),我们的元素(节点)是重新分布在已经有 32 个单元的数组上。
为什么查找时间为 O(1)?因为我们在hashmap中有一个数组,并且通过索引在数组中的搜索是在恒定时间内发生的(因为数组是内存中的一个大对象),但是当hashmap重生为kch树时,搜索就已经是对数了. 如果发生冲突,将通过哈希码进行搜索,然后按值进行搜索,我们将失去线性速度
关于哈希图还有很多要说的。但你应该知道,这是社会保障部门的一个常见问题)