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

时间:2016-10-30 16:45:04

标签: java arrays arraylist memory-management copyonwritearraylist

通常,他们说我们已经从Array移动到ArrayList以获得以下原因

  

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

ArrayList的一个缺点是:

  

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

如果我们使用ArrayList.TrimSize(),那会使Array List成为一致的选择吗?消除了唯一的优势(固定大小)数组已超过它?

2 个答案:

答案 0 :(得分:0)

一个简短的答案是:trimToSize并不解决所有问题,因为数据在增长后收缩 - 与首先阻止增长不同;前者有复制+垃圾收集的费用。

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

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

答案 1 :(得分:0)

如果您正在开发极其内存关键型应用程序,还需要可调整性并且性能可以被折衷,那么修剪数组列表是您最好的选择。这是唯一一次,带有修剪的数组列表将是一致的选择。

在其他情况下,您实际做的是:

  1. 您已创建数组列表。列表的默认容量为10.
  2. 添加了元素并应用了修剪操作。所以尺寸和容量现在都是1.修剪尺寸如何工作?它基本上创建一个具有列表实际大小的新数组,并将旧数组数据复制到新数组。旧数组留给垃圾收集。
  3. 您再次添加了一个新元素。由于列表已满,因此将重新分配更多50%的空格。同样,将遵循类似于2的程序。
  4. 再次调用TrimSize,它遵循与2. <2. li>相同的过程
  5. 事情重复......
  6. 所以你看,我们为了保持列表容量和大小相同而产生大量性能开销。固定尺寸不会为您提供任何有利的优势,除了节省更多的额外空间,这在现代机器中几乎不是问题。

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