是否有理由更喜欢阵列而不是ArrayLists?

Bro*_*ork 18 java arrays list arraylist

可能重复:
数组的好处

嘿,

有什么理由喜欢Arrays (MyObject[])ArrayLists (List<MyObject>)?使用Arrays的唯一剩下的地方是原始数据类型(int,boolean等).但是我对此没有合理的解释,只是让代码变得更加苗条.

一般来说,我使用List来保持更好的灵活性.但是有没有理由使用真正的阵列?

我想知道,最好的问候

MAK*_*MAK 15

每当我知道我只使用固定数量的元素时,我更喜欢使用Arrays over ArrayLists.我的理由主要是主观的,但无论如何我都在这里列出:

  1. 使用Collection基元类比较慢,因为它们必须使用自动装箱和包装器.

  2. 我更喜欢更直接的[]语法来访问过的元素ArrayListget().当我需要多维数组时,这变得更加重要.

  3. ArrayLists通常提前分配大约两倍的内存,以便您可以非常快速地追加项目.如果你永远不会再添加任何物品,那么就会有浪费.

  4. (可能与前一点有关)我认为ArrayList访问通常比普通数组慢.的ArrayList实现使用的底层数组,但所有访问必须经过get(),set(),remove()等的方法,这意味着它通过比简单的阵列访问更多的代码.但我实际上没有测试过差异,所以我可能错了.

话虽如此,我认为这个选择实际上取决于你需要它.如果您需要固定数量的元素,或者如果您要使用多个维度,我建议使用普通数组.但是如果你需要一个简单的随机访问列表,并且要对它进行大量的插入和删除,那么使用它就更有意义了.Arraylist


Lan*_*dei 1

一般来说,数组有其问题,例如类型安全:

Integer[] ints = new Integer[10];
Number[] nums = ints; //that shouldn't be allowed
nums[3] = Double.valueOf[3.14]; //Ouch!
Run Code Online (Sandbox Code Playgroud)

它们也不能很好地处理集合。所以一般来说你应该更喜欢集合而不是数组。在某些事情上数组可能会更方便。正如您已经说过的,原始类型将是一个原因(尽管您可以考虑使用类似集合的库,例如Trove)。如果数组隐藏在对象中并且不需要更改其大小,则可以使用数组,特别是如果您需要可以获得的所有性能(例如用于 3D 图形的 3D 和 4D 矢量和矩阵)。使用数组的另一个原因可能是您的 API 有很多可变参数方法。

顺便说一句:如果您需要匿名类的可变变量,那么使用数组有一个可爱的技巧:

public void f() {
   final int[] a = new int[1];
   new Thread(new Runnable() {
      public void run() {
         while(true) {
            System.out.println(a[0]++);
         }
      }    
   }).start();  
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不能用 int 变量替换数组,因为它必须(有效)是最终的。