Javahashcode是一个整数(大小2 pow 32)
当我们创建一个哈希表/hashmap时,它会创建大小等于Map初始容量的桶。换句话说,它创建了一个大小为“初始容量”的数组
问题1.它如何将键(java对象)的hashcode映射到桶索引?2.由于hashmap的大小可以增长,那么hashmap的大小可以等于2 pow 32吗?如果答案是肯定的,那么拥有一个大小为2 pow 32的数组是明智的?
这是当前源代码的链接:http://www.docjar.com/html/api/java/util/HashMap.java.html
你的问题的答案(部分)是具体实现的。
1)查看代码。请注意,您对和/code>如何实现的假设是不正确的…至少对于OracleJava6和7。具体来说,
和/code>不一定是hashmap的数组大小。
2)
HashMap
的大小是条目的数量,可以超过2^32
!我假设你实际上是在谈论容量。HashMap的数组的大小理论上限于2^31-1
(Java数组的最大大小)。对于当前的实现,MAX_CAPACITY
实际上是2^30
;参见代码。
3)"……拥有一个大小为
2^32
的数组是明智的?"对于目前定义的Java是不可能的,尝试做一些不可能的事情是不明智的。
如果你真的在问Java中哈希表数据结构的设计,那么在正常大小的哈希表的效率和巨大的哈希表之间需要权衡;即具有明显超过
2^30
元素的映射。HashMap
实现被调整为最适合正常大小的映射。如果您经常必须处理巨大的映射,并且性能至关重要,那么您应该寻求实现一个适应您特定要求的自定义映射类。
匿名用户
Java数组的大小实际上限于整数。MAX_VALUE元素,2^31-1。
HashMap使用两种数组大小的幂,因此它可以使用的最大值可能是2^31。您需要很大的物理内存才能使其合理。
HashMap在执行简单的按位与获取桶索引之前,会执行一系列移位和异或操作以减少一些冲突源。
相关问题
- HashCode-如果相等的对象碰巧在同一个桶中散列会发生什么?
- Java哈希码和桶大小-关系
- JavaHashMap实现hashcode问题
- JavaHashMap内部数据结构在重新散列期间如何变化?
- HashMap基于大小的重新散列
- 散列码的分布如何影响Java的HashMap何时重新散列?
- 当HashMap增加其大小时,HashMap中值的索引会发生什么?
- Jest vanilla JavaScript JSDOM刷新失败,切换beforeAll到before每一个后的第二次测试中断
- 线程“main”java. lang.NoClassDefFoundError中的异常:在Intellij[Spring boot]中
- 线程“main”java. lang.NoClassDefFoundError中的异常:org/apache/log4j/ProvisionNode
- log4j2 java. lang.NoClassDefFoundError:org/apache/log/log4j/LogManager
- RxJava:防止一个可观察对象发射,直到另一个可观察对象的数据被发射
- 结合RxJava了解Android内存泄漏
- 在-O0 vs-O3中__rdtsc()的汇编代码[重复]
- 不同缓冲区大小的不同内存对齐
- 获取x86-64指令的大小
- Visual C关系运算符重载const正确性(使用std::排序)
- Python-延迟后运行异步功能,不阻塞其他代码
- Javascript中的不和音乐机器人
- 如何在gradle的测试源代码集中包含所有src/test/资源/**和src/main/java/**/*. html?