Java 接近内存容量时调整阵列大小

Java 接近内存容量时调整阵列大小,java,arrays,resize,Java,Arrays,Resize,因此,我正在用java实现自己的哈希表,因为内置的哈希表每个条目都有荒谬的内存开销。我正在用二次散列的一种变体创建一个开放寻址表,它由两个数组在内部支持,一个用于键,一个用于值。但是我没有调整大小的能力。显而易见的方法是创建更大的数组,然后将所有(键、值)对从旧数组散列到新数组中。但是,当我的旧阵列占用当前内存的50%以上时,就会出现这种情况,因为我无法在内存中同时容纳旧阵列和新阵列。在这种情况下,有没有办法调整哈希表的大小 编辑:我得到的关于当前哈希表内存开销的信息来自这里 另外,对于我当前的

因此,我正在用java实现自己的哈希表,因为内置的哈希表每个条目都有荒谬的内存开销。我正在用二次散列的一种变体创建一个开放寻址表,它由两个数组在内部支持,一个用于键,一个用于值。但是我没有调整大小的能力。显而易见的方法是创建更大的数组,然后将所有(键、值)对从旧数组散列到新数组中。但是,当我的旧阵列占用当前内存的50%以上时,就会出现这种情况,因为我无法在内存中同时容纳旧阵列和新阵列。在这种情况下,有没有办法调整哈希表的大小

编辑:我得到的关于当前哈希表内存开销的信息来自这里


另外,对于我当前的应用程序,我的值是整数,因此我没有存储对整数的引用,而是使用一个整数数组作为我的值。

简单的答案是“不,没有办法扩展现有数组的长度”。也就是说,您可以为哈希表增加额外的复杂性,并使用数组数组(或者只对两个数组进行专门化和硬代码支持)。

解决此问题的方法可能是: ->创建一个列表来存储矩阵的内容(为每一行设置一个列表,然后在可能的情况下逐个释放相关数组的内存); ->创建新的矩阵; ->用列表中存储的值填充矩阵(从列表中复制信息后立即从列表中删除1个元素)

如果矩阵元素是指向元素本身的指针,那么这会更容易。
这是一个非常理论化的解决问题的方法,但我希望它能帮助您划分哈希表。例如,您可以根据哈希代码中的1-4位划分2-16个分区。这将允许您一次调整哈希表的一部分大小


如果您有一个占内存很大比例的散列表,那么您就有一个严重的设计问题。您使用的是移动设备吗?内存限制是什么?您是否使用了Trove4j,它也不使用entry对象。

是否要备份内置散列表的断言“每个条目荒谬的内存开销”?你的断言基于什么?他提到开放寻址表,所以我假设他指的是HashMap$entry的开销。如果你检查HashMap.entry源代码,它有3个引用(键、值和下一个条目)还有一个
int
作为密钥散列。您可能可以去掉对下一个条目的引用,但我希望就是这样。除非您不介意调用key.hashCode()一直以来-然后你也可以去掉
int
。那是什么?在64位JVM上每个条目12字节?我想更好的问题是为什么需要最小化内存。这是在智能手机或嵌入式设备上运行的吗?如果是这样,那么这是一个合理的问题;否则这是过早的优化。@tkhala:每个HashMap.entry n使用带有小指针的HotSpot VM,需要24个字节的内存。8个字节用于对象头,16个字节用于四个字段:键、值、哈希、下一个。省略HashMap。因此,数据结构中的条目为每个条目节省28个字节。最后4个字节用于指向该条目的额外指针。