何时在Java中使用List over Array?

Joh*_*itt 32 java arrays list data-structures

在Java中,何时优先使用List而不是Array?

Tom*_*and 39

我认为问题是相反的 -

什么时候应该在列表上使用数组?

只有你有特定的理由这样做(例如:项目限制,记忆关注(不是一个很好的理由),等等)

列表更容易使用(imo),并具有更多功能.

注意:您还应该考虑是否像Set或其他数据结构这样的东西比List更适合您要做的事情.

每个数据结构和实现都有不同的优点/缺点.挑选那些你需要做的事情.

如果你需要get()为任何项目的O(1)?可能使用ArrayList,需要O(1)insert()?可能是一个链接列表.需要O(1)包含()?可能是一个哈希集.

TLDR:每个数据结构都擅长某些东西,而其他东西则不好.查看您的目标并选择最适合给定问题的数据结构.

编辑:

有一点没有注意到,最好将变量声明为其接口(即List或Queue)而不是其实现类.这样,您可以在以后更改实现,而无需更改代码中的任何其他内容.

举个例子:

List<String> myList = new ArrayList<String>(); 
Run Code Online (Sandbox Code Playgroud)

VS

List<String> myList = new LinkedList<String>(); 
Run Code Online (Sandbox Code Playgroud)

请注意,myList在两个示例中都是List.- R. Bemrose

  • 有一点没有注意到,最好将变量声明为其接口(即List或Queue)而不是其实现类.这样,您可以在以后更改实现,而无需更改代码中的任何其他内容. (2认同)
  • 例如:`List <String> myList = new ArrayList <String>();`或`List <String> myList = new LinkedList <String>();`注意myList是一个`List <String>`例子. (2认同)

Tom*_*ine 16

经验法则:

  • 使用a List作为参考类型.
  • 使用数组作为基元.
  • 如果必须处理使用数组的API,则使用数组可能很有用.OTOH,使用Lists 对类型系统强制进行防御性复制可能很有用.
  • 如果您List对序列执行了大量类型操作,并且它不在性能/内存关键部分中,那么请使用List.
  • 低级优化可能使用数组.通过低级优化预期肮脏.

  • +1表示有关基元的优势. (2认同)

vdr*_*vdr 10

大多数人已经回答了.

几乎没有充分的理由使用数组而不是List.主要的例外是原始数组(如int[]).您无法创建基元列表(必须具有List<Integer>).

最重要的区别是,使用List时,您可以决定使用哪种实现.最明显的是选择LinkedList或ArrayList.

我想在这个答案中指出,选择实现可以让您对数据无法控制的数据进行非常精细的控制:

  1. 您可以通过将列表包装在一个中来阻止客户端修改列表 Collection.unmodifiableList
  2. 您可以使用同步列表进行多线程处理 Collection.synchronizedList
  3. 您可以使用实现创建固定长度的队列 LinkedBlockingQueue
  4. ......等

在任何情况下,即使您不希望(现在)列表的任何额外功能.只需使用ArrayList并使用您创建的数组大小调整它的大小.它将在后端使用一个Array,与真实阵列的性能差异可以忽略不计.(原始数组除外)


Chr*_*sel 7

几乎总是喜欢列表.列表具有更多功能,尤其是迭代器支持.您可以使用toArray()方法随时将列表转换为数组.


Sur*_*rya 5

总是更喜欢列表。

数组当

  1. 方法的可变参数(我猜你被迫在这里使用数组)。
  2. 当您希望集合是协变的(引用类型的数组是协变的)时。
  3. 性能关键代码。