4

我有一个简单的疑问,当 Arraylist 变满时,它会随着因子(2,1.5 或 old_capacity*3/2 +1 或其他任何值)增加它的大小,并在其中添加新元素。那么如果数字被某些因素删除,为什么不动态减小它的大小。就像我在 arraylist 中有 10000 个元素并且在特定时间所有元素都被删除了,现在数组列表中只有 100 个元素它仍然拥有 10000 个对象内存。为什么我必须调用 trimTosize() 之类的?为什么不是他们的自动?我错过了什么 .. ?请不要告诉我该怎么做,我想知道为什么我们必须这样做??谢谢

4

3 回答 3

6

那么如果数字被某些因素删除,为什么不动态减小它的大小。

出于性能原因。分配内存始终是一项昂贵的操作。不释放它背后的逻辑是,如果你的数据结构已经达到给定的大小,即使你删除了元素,那么它将来可能会再次达到那个大小。

重新分配也可能很昂贵(这取决于实现,但通常是正确的。请参阅realloc的 C),因为您可能需要释放先前分配的内存的整个块,然后为调整大小的结构重新分配一个新的块。

于 2013-04-24T09:53:10.007 回答
0

如果一个ArrayList已满并且您想添加一个新元素,那么除了增加它的大小之外别无他法。如果您删除条目并且尺寸变小,则实际上不需要调整它的大小 - 将其保持在其大小将是更高效的方式。也许很快会添加新项目?

如果你想让它变小,你仍然可以使用trimToSize().

因此,自动增加其大小是有意义的,但不会自动减小它。

于 2013-04-24T09:59:42.143 回答
0

因为如果你有一个包含一百万成员的列表,然后删除一个,你真的想将 999,999 个引用复制到一个新数组吗?

编辑:为了解决评论中的一个问题 - 在集合“自动”调整大小时设置一些阈值的问题是它使性能管理变得困难。

如果我从数组列表中删除一个元素,我希望该操作需要一定的时间。第 499,999 次删除应该花费与第 500,000 次删除相似的时间。如果我真的想在某个时候调整集合的大小,我可以使用提供的方法来做到这一点 - 但它在我的控制之下。

于 2013-04-24T09:53:31.663 回答