繁体   English   中英

ArrayList.TrimToSize()和Array之间的区别?

[英]Difference between ArrayList.TrimToSize() and Array?

通常,他们说我们出于以下原因从Array移到ArrayList

数组是固定大小的,而数组列表则不是。

ArrayList的缺点之一是:

当达到其容量时,ArrayList变为其实际大小的3/2。 结果,如果我们没有正确利用空间,内存可能会浪费掉。在这种情况下,首选数组。

如果我们使用ArrayList.TrimSize(),将使Array List成为一个一致的选择吗? 消除唯一的优势(固定大小)阵列比它有优势吗?

一个简短的答案是:trimToSize不能解决所有问题,因为在数组增长之后缩小数组-不同于首先阻止增长; 前者的成本是复制+垃圾回收。

更长的答案是:int []是低级的,ArrayList是高级别的,这意味着它更方便,但对细节的控制较少。 因此,在面向业务的代码中(例如,操作“产品”的简短列表),我将更喜欢ArrayList,这样我就可以忽略技术性并专注于业务。 在面向数学的代码中,我可能会选择int []。

还有其他细微的差异,但我不确定它们与您的相关性如何。 例如,并发性:如果您同时从多个线程更改ArrayList的数据,则将有意失败,因为这是大多数业务代码的直观要求。 一个int []将允许您做任何您想做的事情,由您自己来确定是否有意义。 同样,这些都可以概括为“低级” ...

如果您正在开发对内存至关重要的应用程序,则还需要可调整大小,并且可以权衡性能,那么修剪数组列表是您的最佳选择。 这是唯一一次带有修剪的数组列表的一致选择。

在其他情况下,您实际正在执行的操作是:

  1. 您已经创建了一个数组列表。 列表的默认容量为10。
  2. 添加了元素并应用了修剪操作。 因此,大小和容量现在都是1.修剪尺寸如何工作? 它基本上会创建一个具有列表实际大小的新数组,并将旧的数组数据复制到新的数组。 旧阵列留作抓斗收集。
  3. 您再次添加了一个新元素。 由于列表已满,将重新分配50%的空间。 同样,将遵循类似于2的过程。
  4. 再次调用TrimSize,它遵循与2相同的过程。
  5. 事情重复了...

因此,您会发现,为了保持列表容量和大小不变,我们会承担很多性能开销。 固定大小在这里没有提供任何优势,只是节省了很少的额外空间,这在现代机器中几乎不是问题。

简而言之,如果您希望在不编写大量样板代码的情况下实现可调整性,那么数组列表是一致的选择。 但是,如果大小从不改变,并且您不需要任何动态功能(例如删除操作),那么数组是更好的选择。 很少有额外的字节几乎不是问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM