为什么数组列表动态增加而不是动态减少

时间:2013-04-24 09:50:28

标签: java collections

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

3 个答案:

答案 0 :(得分:6)

  

那么为什么不删除数字时动态减小它的大小   一些因素。

出于效果的原因。分配内存总是一项昂贵的操作。不解除分配的逻辑是,如果您的数据结构已达到给定的大小,即使您删除了元素,那么它将来可能再次达到该大小。

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

答案 1 :(得分:0)

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

编辑:为了解决评论中的问题 - 集合“自动”调整大小的问题是,它会使性能管理变得困难。

如果我从arraylist中删除一个元素,我会将该操作删除一段时间。第499,999次移除应该花费相同的时间来移除第500,000次。如果我真的想在某个时刻调整集合的大小,我可以通过使用提供的方法来实现这一点 - 但是然后它在我的控件下。

答案 2 :(得分:0)

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

如果您希望它变小,您仍然可以使用trimToSize()

因此,自动增大尺寸是有意义的,但不能自动减小尺寸。