【问题标题】:Hashmap value storage if it exceeds integer rangeHashmap 值存储,如果它超出整数范围
【发布时间】:2015-09-08 08:05:02
【问题描述】:

正如我们许多人所知,最初HashMap 分配的内存默认初始容量为 16,默认加载因子为 0.75。现在,当我们尝试将值存储到HashMapfirst 时,它通过在哈希映射键上调用哈希码函数来计算存储桶位置。假设如果用户定义的hashcode方法返回一个大于整数范围的值并且该值超出HashMap的初始容量地址,那么该值将如何存储在HashMap中?

由于 hashcode 方法可以返回整数范围内的任何值,那么 JVM 怎么知道它必须将哈希映射值存储在最初分配的内存位置?

【问题讨论】:

  • 由于 hashcode 方法可以返回整数范围内的任何值,那么 JVM 如何知道它必须在最初分配的内存位置存储哈希映射值?例如,当我们创建哈希映射时,它会创建一个大小为 16 个插槽的数组。当我们尝试将值存储到哈希映射时,它会存储在这个数组中。所以 JVM 如何知道它必须存储在这个数组中,因为哈希码函数可以返回地址值大于数组地址大小。
  • 你的问题写得很混乱。

标签: hashmap integer-overflow


【解决方案1】:

Hash Map最多可以有Integer.MAX_VALUE,超过这个限制后会导致size()等一些方法出现意外行为,但不会影响remove()get()等方法和put() 因为remove() 会从此映射中删除指定键的映射(如果存在),get() 返回指定键映射到的值,如果此映射不包含键的映射,则返回 null。并且put() 将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,则替换旧值。新对象与现有对象之间怎么会发生冲突。

参考 - http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

【讨论】:

  • 由于 hashcode 方法可以返回整数范围内的任何值,那么 JVM 如何知道它必须将哈希映射值存储在最初分配的内存位置?
【解决方案2】:

存储对象的桶的索引是根据hashCode的结果计算出来的,但实际上很少等于它。

例如如果您使用桶数的二次幂,一种常见的方法是

bucketIndex = key.hashCode() & (numberOfBuckets - 1);

我不知道HashMap使用什么精确的方法来计算桶索引。

【讨论】:

  • 感谢您的回复。正如您所说的存储对象的存储桶的索引是根据 hashCode 的结果计算的。但是如果 hashcode 返回一个值,其中存储桶索引可能超出分配的范围记忆。
  • @user3309975:那你计算桶索引的函数选择的不是很好,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2020-03-22
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多