是否有理由更喜欢数组而不是数组列表?

2022-09-02 01:45:56

可能重复:
阵列的好处

嘿,

有什么理由更喜欢吗?使用数组的唯一位置是基元数据类型(int、布尔值等)。但是我对此没有合理的解释,它只是使代码更薄一些。Arrays (MyObject[])ArrayLists (List<MyObject>)

一般来说,我使用List是为了保持更好的灵活性。但是,是否有理由使用真正的数组呢?

我想知道,最好的问候


答案 1

每当我知道我只打算使用固定数量的元素时,我更喜欢使用s而不是s。我的理由大多是主观的,但无论如何,我在这里列出它们:ArrayArrayList

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

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

  3. ArrayLists 通常会提前分配大约两倍于您现在需要的内存,以便您可以非常快速地追加项目。因此,如果您不打算再添加任何项目,就会浪费。

  4. (可能与上一点有关)我认为访问速度比普通阵列慢。该实现使用底层数组,但所有访问都必须通过 、 、 等方法,这意味着它比简单的数组访问要经历更多的代码。但我实际上还没有测试过差异,所以我可能是错的。ArrayListArrayListget()set()remove()

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


答案 2

通常,数组有其问题,例如类型安全性:

Integer[] ints = new Integer[10];
Number[] nums = ints; //that shouldn't be allowed
nums[3] = Double.valueOf[3.14]; //Ouch!

他们也不太擅长收藏。因此,与数组相比,您应该更喜欢集合。只有几件事,数组可能更方便。正如你已经说过的那样,基元类型将是一个原因(尽管你可以考虑使用像Trove这样的类似集合的库)。如果数组隐藏在对象中并且不需要更改其大小,则可以使用数组,特别是如果您需要可以获得的所有性能(例如3D和4D矢量和矩阵用于3D图形)。使用数组的另一个原因可能是如果您的API有很多varargs方法。

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

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

请注意,不能使用 int 变量执行此操作,因为它必须是 final。