什么是一个ArrayList比Java中的数组更好?

时间:2009-08-17 14:26:44

标签: java arrays data-structures collections

我应该何时在Java中使用ArrayList,何时应该使用数组?

9 个答案:

答案 0 :(得分:8)

一些差异:

  • 数组的大小是不可变的,你不能轻易删除和元素并删除空洞,而使用ArrayList很简单
  • 数组快速(由JVM作为特殊对象直接处理)而不是ArrayList并且需要更少的内存
  • 数组有一个很好的语法来访问元素(例如a[i] vs a.get(i)
  • 数组与泛型不匹配(例如,您无法创建通用数组)
  • 无法轻松将数组包装为ArrayList(例如checkedListsynchronizedListunmodifiableListCollections工具包
  • ArrayList声明为List,您可以在需要时轻松地将实施与LinkedList交换;这个imho是比普通数组更好的优势
  • 数组的toStringequalshashCode很奇怪且容易出错,您必须使用Arrays类实用程序

答案 1 :(得分:7)

另外两点:

  • 您可能需要考虑使用数组来表示多个维度(例如矩阵)。
  • 数组可用于存储基元,因此比使用ArrayList提供更紧凑的数据表示。

答案 2 :(得分:5)

当您事先不知道所需的元素数量时,ArrayLists非常有用。简单示例:您正在阅读文本文件并构建您找到的所有单词的列表。你可以继续添加到你的数组列表,它会增长。

您需要预先声明其大小的数组。

答案 3 :(得分:4)

这不仅仅是因为数组需要增长,集合更容易处理。

当你需要迭代元素时,有时数组很好,只读。但是,大多数情况下你想使用像contains等方法。

您无法创建通用数组,因此它“可能”或可能不会打扰您。

如果有疑问,请使用收藏集,它会让使用您API的人爱你:-)。如果您只为它们提供数组,那么它们将编写的第一行代码是:

Arrays.asList(thatGuyArray);

答案 4 :(得分:4)

List接口,其中ArrayList是Java Collections Framework中的实现,比普通Java阵列提供的要丰富得多。由于集合框架在整个Java和第三方库中得到了相对广泛的支持,因此使用ArrayList而不是数组通常是有意义的。如果真的需要它我只会使用数组:

  • 我正在调用的其他界面
  • 需要它们
  • 分析显示了阵列访问可以比列表访问产生显着加速的情况下的瓶颈
  • 数组感觉更自然的情况,例如

    中的原始数据缓冲区
    byte[] buffer = new byte[0x400]; // allocate 1k byte buffer
    

如果需要,可以随时获取ArrayList的数组表示:

Foo[] bar = fooList.toArray(new Foo[fooList.size()])

这是一种常见的失败模式,即方法返回对类的私有数组成员(字段)的引用。当外人获得对类私有状态的可变访问时,这打破了类的封装。因此,您需要始终克隆数组并返回对克隆数组的引用。使用ArrayList,您可以使用...

return Collections.unmodifiableList(privateListMember);

...以返回保护实际列表对象的包装器。当然,您需要确保列表中的对象也是不可变的,但这也适用于(克隆的)可变对象数组。

根据Nick Holt的评论,你不应该在任何地方公开List是一个ArrayList的事实:

private List<Foo> fooList = new ArrayList<Foo>();

public List<Foo> getFooList() {
    return Collections.unmodifiableList(fooList);
}

答案 5 :(得分:3)

必须使用固定大小声明数组,因此您需要事先知道元素的数量。

如果您不知道预先需要多少元素,则可以使用ArrayList,因为它可以根据需要增长。

如果您需要执行其API中可用的操作,并且需要手动实现阵列,则ArrayList也可能更受欢迎。 (例如indexOf)

答案 6 :(得分:2)

如果您想通过添加或删除元素来更改其大小。

当你想将它传递给想要Collection或Iterable的东西时(尽管你可以使用Arrays.asList(a)来创建一个数组,a,看起来像一个List)。

答案 7 :(得分:2)

我想说默认假设应该是使用ArrayList,除非你有特殊需要,只是因为它可以使你的代码更灵活,更不容易出错。当你添加额外的元素500行代码时,不需要扩展声明大小等。并引用List接口,所以你可以用LinkedList或CopyOnWriteArrayList或任何其他可能有助于情况的列表实现替换Array列表无需更改大量代码。

话虽这么说,数组有一些你不会从列表中获取的属性。一个是具有null元素的定义大小。如果您不想按顺序保存,这可能很有用。例如,一个井字游戏。

阵列可以是多维的。 ArrayLists不能。

Arrays可以处理原语,而ArrayList不能处理(虽然有第三方集合类包装原语,但它们不是标准集合API的一部分)。

答案 8 :(得分:0)

天儿真好,

到目前为止人们似乎错过了几点。

  1. 一个数组只能包含一种类型的对象,而ArrayList是一个可以包含多种对象类型的容器,它是异构的,
  2. 数组必须在声明数组本身时声明其内容的类型。声明ArrayList时,ArrayList不必声明其内容的类型
  3. 您必须将项目插入数组中的特定位置。添加到ArrayList是通过容器上的add()方法和
  4. 完成的
  5. 对象存储在数组中并保留其类型,因为数组只能存储特定类型的对象。对象通过超类类型Object存储在ArrayList中。
  6. 编辑:哎呀。关于列表中的最后一点,我忘记了你有一个对象数组的特殊情况,然后这些数组也可以包含任何类型的对象。谢谢你的评论,Yishai! ( - :

    HTH

    欢呼声,