何时在Java中使用List over Array?

时间:2009-10-19 16:48:31

标签: java arrays list data-structures

在Java中,什么时候优先使用List而不是数组?

8 个答案:

答案 0 :(得分:16)

经验法则:

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

答案 1 :(得分:10)

大多数人已经回答了它。

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

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

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

  1. 您可以通过将列表包含在Collection.unmodifiableList
  2. 中来阻止客户修改您的列表
  3. 您可以使用Collection.synchronizedList
  4. 同步多线程列表
  5. 您可以创建一个实现LinkedBlockingQueue
  6. 的固定长度队列
  7. ...... etc
  8. 在任何情况下,即使您不希望(现在)列表的任何额外功能。只需使用ArrayList并使用您创建的数组大小调整它的大小。它将在后端使用一个Array,与真实阵列的性能差异可以忽略不计。 (原始数组除外)

答案 2 :(得分:7)

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

答案 3 :(得分:4)

总是喜欢列表。

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

答案 4 :(得分:2)

如果你知道你将持有多少东西,你会想要一个阵列。我的屏幕是1024x768,并且在运行时期间,像素缓冲区的大小永远不会改变。

如果您知道需要访问特定索引(请参阅项目#763!),请使用数组或数组支持列表。

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

一般来说,处理硬件,数组,处理用户,列表。

答案 5 :(得分:1)

这取决于列表的类型。

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

如果您事先不知道将会有多少元素,最好使用ArrayList。当您向其添加更多元素时,ArrayList会正确分摊增长支持数组的成本,并且适用于元素到位后的随机访问。可以有效地对ArrayList进行排序。

答案 6 :(得分:0)

如果您希望扩展项目数组(即,如果您事先不知道列表的大小),则列表将是有益的。但是,如果您想要性能,通常会使用数组。

答案 7 :(得分:0)

在许多情况下,使用的集合类型是一个不应暴露给外界的实现细节。您的返回类型越通用,您之后就可以更灵活地更改实现。

数组(原始类型,即new int [10])不是通用的,如果没有内部转换或更改客户端代码,您将无法更改实现。您可能希望将Iterable视为返回类型。