我有这个4维数组存储字符串值,用于创建一个地图,然后用paintComponent显示在屏幕上。我读过许多文章说使用大型数组是非常低效的。 (特别是因为数组尺寸是16x16x3x3)我想知道是否有任何方法来存储字符串值(我将它们用作ID值),以节省内存或减少提取时间。如果您有任何想法或方法,我将不胜感激。谢谢!
答案 0 :(得分:4)
好吧,如果你的矩阵已满,那就是每个元素都包含数据,那么我相信一个数组是最优的。但是如果你的矩阵很稀疏,你可以考虑使用更多基于链接的数据类型。
我要做的第一件事是不使用字符串作为ID,使用int。它会大大减少你的结构尺寸。
此外,该阵列确实不是那么大,如果这是您拥有的唯一数据结构,我不会担心效率。它只有2304个元素。
答案 1 :(得分:2)
请记住,String值与数组是分开的。无论链接到哪个字符串值,数组本身都占用相同的内存空间。无论您在那里保存了什么类型的对象,或者该对象的值是什么,访问数组中的特定地址都将花费相同的时间。
但是,如果您发现许多字符串值表示完全相同的字符串,则可以通过利用String.intern()来避免使用相同字符串的多个副本。如果存储实习字符串,并且您没有对非实习字符串的任何其他引用,则可以将非实习字符串释放为垃圾收集。然后,您的数组将具有指向相同内存空间的多个条目,而不是具有等效字符串对象的不同内存地址。
另见:
根据ID的要求,您可能还希望使用与字符串不同的数据结构。例如,虽然数组本身的大小相同,但存储int
值将避免为每个单独的条目分配额外空间。
此外,一开始,四维数组可能不是最符合您需求的数据结构。你能描述为什么你选择这个数据结构来代表你想要代表的东西吗?
答案 2 :(得分:2)
首先,16 * 16 * 3 * 3 = 2304 - 非常谦虚。在这个尺寸下,我会更担心4D阵列可能导致的混乱而不是它所采用的尺寸!
正如其他人所说,如果完全填充,阵列就可以了。如果它有间隙,则ArrayList或类似物会更好。
如果字符串只是ID,为什么不存储枚举(甚至是整数)而不是字符串?
答案 3 :(得分:1)
Strings只占用每个数组元素中引用的空间。如果字符串来自一组非常小的值,则可以节省成本。一个更重要的问题是你的四维数组是稀疏的还是大部分填充的?如果您实际指定的值非常少,那么您可以节省大量资金,将4-d数组替换为从指标到字符串的Map。如果您需要代码示例,请与我们联系。
答案 4 :(得分:0)
你真的有一个16x16x3x3(即2k)字符串对象的4D数组吗?这对我来说听起来不是那么大。就内存而言,数组是存储对象集合的最有效方法。 ArrayList的效率可能稍低(浪费空间高达50%)。
我能想到的唯一另一种方法是将Strings端到端存储在一个巨大的String中,然后使用substring()从中获取所需的位,但是你仍然需要在某处存储索引
你内存不足吗?如果是这样,请检查数组中的字符串是否与您认为的大小相同 - Java中String实例的后备数组可能比字符串本身大得多。如果在1 GB字符串上执行subString(),则返回的字符串实例将共享第一个字符串的1 GB数组,这样可以使GC的持续时间超出预期。