2

一般来说,他们说我们从 Array 转移到 ArrayList 的原因如下

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

ArrayList 的缺点之一是:

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

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

4

2 回答 2

0

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

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

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

于 2016-10-30T18:58:21.813 回答
0

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

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

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

所以你看,为了保持列表容量和大小相同,我们产生了大量的性能开销。固定尺寸在这里并没有为您提供任何好处,除了节省更多的额外空间,这在现代机器中几乎不是问题。

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

于 2016-10-30T19:19:50.057 回答