所以我在java中实现自己的哈希表,因为内置的哈希表每个条目都有可笑的内存开销。我正在制作一个带有二次散列变体的开放式地址表,它由两个数组内部支持,一个用于键,一个用于值。我没有能力调整大小。显而易见的方法是创建更大的数组,然后将所有(键,值)对从旧的数组中散列到新数组中。虽然我的旧阵列占用了当前内存的50%以上,但由于我无法同时在内存中同时使用旧阵列和新阵列,因此这种情况会分崩离析。在这种情况下有没有办法调整哈希表的大小
编辑:我获得的当前哈希表内存开销的信息来自How much memory does a Hashtable use?
另外,对于我当前的应用程序,我的值是int,所以不是存储对Integers的引用,而是有一个int数组作为我的值。
答案 0 :(得分:1)
简单的答案是“不,没有办法扩展现有数组的长度”。也就是说,您可以为哈希表添加额外的复杂性并使用数组数组(或仅对两个数组进行专门化和硬编码支持)。
答案 1 :(得分:1)
您可以对哈希表进行分区。例如你可以根据hashCode中的1-4位分成2-16个分区。这将允许您一次调整哈希表的一部分。
如果你有一个哈希表占你的内存大小的很大一部分,你有一个严重的设计问题恕我直言。您使用的是移动设备吗?你的记忆限制是什么?您是否使用过不使用入口对象的Trove4j?
答案 2 :(得分:0)
问题的解决方案可能是: - >创建一个列表来存储矩阵的内容(为每一行设置一个列表,然后在可能的情况下逐个释放所讨论的数组的内存); - >创建新矩阵; - >使用存储在列表中的值填充矩阵(从复制信息后立即从列表中删除1个元素。
如果矩阵元素是指向元素本身的指针,这可能会更容易。 这是问题的一个非常理论的方法,但我希望它有所帮助