何时在Java中使用List over Array?

When to use a List over an Array in Java?

在Java中,何时优先使用列表而不是数组?


我认为这个问题恰恰相反-

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

只有您有特定的理由这样做(例如:项目约束、内存问题(不是很好的理由)等)

列表更易于使用(IMO),并且具有更多的功能。

注意:您还应该考虑像集合或其他数据结构之类的东西是否比列表更适合您正在尝试做的事情。

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

如果您需要get()为任何项的o(1)?可能使用arraylist,需要o(1)insert()?可能是一个链表。需要o(1)contains()?可能是哈希集。

TLDR:每个数据结构都擅长某些事情,而不擅长其他事情。看看你的目标,选择最适合给定问题的数据结构。

编辑:

One thing not noted is that you're
better off declaring the variable as
its interface (i.e. List or Queue)
rather than its implementing class.
This way, you can change the
implementation at some later date
without changing anything else in the
code.

As an example:

1
List<String> myList = new ArrayList<String>();

vs

1
List<String> myList = new LinkedList<String>();

Note that myList is a List in both examples.
--R. Bemrose


经验法则:

  • 引用类型使用List
  • 对基元使用数组。
  • 如果必须处理使用数组的API,那么使用数组可能很有用。Otoh,使用Lists使用类型系统强制进行防御复制可能会很有用。
  • 如果您对序列执行了大量的List类型的操作,但它不在性能/内存关键部分中,则使用List
  • 低水平优化可能使用阵列。期待低水平优化带来的污秽。


大多数人已经回答过了。

几乎没有好的理由使用数组而不是列表。主要异常是原始数组(如int[])。不能创建基元列表(必须有List)。

最重要的区别是,当使用列表时,您可以决定将使用什么实现。最明显的是选择LinkedList或ArrayList。

我想在这个答案中指出,选择实现可以使您对数组根本不可用的数据进行非常细粒度的控制:

  • 您可以通过将您的列表包装在Collection.unmodifiableList中来防止客户修改您的列表。
  • 可以使用Collection.synchronizedList同步多线程列表。
  • 您可以使用LinkedBlockingQueue的实现创建一个固定长度的队列。
  • …等
  • 在任何情况下,即使您不想(现在)列表中的任何额外功能。只需使用一个arraylist,并根据创建的数组大小调整它的大小。它将在后端使用一个数组,与实际数组的性能差异将可以忽略不计。(除了基元数组)


    几乎总是喜欢列表。列表有更多的功能,特别是迭代器支持。您可以使用to array()方法随时将列表转换为数组。


    总是喜欢列表。

    数组何时

  • 一个方法的varargs(我想您必须在这里使用数组)。
  • 当您希望集合协变时(引用类型数组协变)。
  • 性能关键代码。

  • 如果你知道你要拿多少东西,你就需要一个数组。我的屏幕是1024x768,它的像素缓冲区在运行时不会改变大小。

    如果你知道你需要访问特定的索引(去获取项763!),使用数组或数组支持的列表。

    如果需要定期添加或删除组中的项目,请使用链接列表。

    一般来说,处理硬件、阵列、处理用户、列表。


    这取决于什么样的清单。

    如果知道将在除结尾以外的位置插入许多元素,最好使用LinkedList。LinkedList不适合随机访问(获取第i个元素)。

    如果事先不知道有多少元素,最好使用数组列表。arraylist正确地分摊了在向其添加更多元素时增加后备数组的成本,并且适合在元素就位后进行随机访问。数组列表可以有效地排序。


    在许多情况下,使用的集合类型是一个实现细节,不应该向外部世界公开。返回类型越通用,您在随后更改实现的灵活性就越高。

    数组(基元类型,即new int[10])不是泛型的,如果不进行内部转换或更改客户端代码,就无法更改实现。您可能希望将ITerable视为返回类型。


    如果您希望扩展项目数组(例如,如果您不知道列表的大小是什么),那么列表将是有益的。但是,如果您想要性能,通常会使用一个数组。