【问题标题】:How to reduce array size without creating new?如何在不创建新数组的情况下减小数组大小?
【发布时间】:2015-12-30 12:27:19
【问题描述】:

我正在使用数组来存储一种对象。我创建了一个固定大小的数组

int arr[]=new int[n];

现在在处理完这个数组后,我想从这个数组中释放多达 75% 的内存(现在只有 n/4 个元素是有用的)。所以我的问题是,由于 n 非常大,我不希望拥有比有用更大的内存,我如何在运行时减小数组的大小而不复制到大小为 n/4 的新数组(甚至可能或不是吗?)

【问题讨论】:

    标签: java arrays resize runtime


    【解决方案1】:

    这是不可能的。初始化后无法更改数组的长度。

    您可以做的是创建另一个大小合适的数组,并使这个大数组符合垃圾收集器的条件。

    如果允许,最好使用ArrayList

    【讨论】:

    • 是的,将有用的值复制到新创建的数组是正确的,但在我的情况下,记录数接近 2000 条,经过一些处理后只有 500 条记录是有用的。这就是为什么会出现这个问题。谢谢!
    • ArrayList 在这里也不是很有用;您必须先将条目打乱以保持在前面,然后调用trimToSize。最好只创建一个新数组并将条目复制到那里。
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 我的数据太大,如果我创建一个新数组并在其中复制数据,它会使我的程序有点慢,而且这种变化很重要。所以在这种情况下,我必须使用数组的整个大小。
    • 实际上这些对象是要列出的整数映射。 :p
    • 2000 个元素很小。复制其中的 500 个并没有那么重要,除非你经常这样做。
    【解决方案2】:

    这根本不可能。即使您使用集合来创建它们,如果数组大小超过,它们也会将数组元素复制到更新大小的数组!

    【讨论】:

    • Shriram 如果你遇到过这种情况,内存优化的方向是什么?
    • 创建一个具有实际大小的新数组并将元素复制到该数组中。
    【解决方案3】:

    不,一旦你创建了一个数组,它的大小就固定了。您不能在运行时更改它。对于您当前的场景,您可以将有用的元素复制到新数组中。或者只是保持数组不关心内存。

    【讨论】:

    • 是的,我明白了,我的思维方向不正确。
    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多