我应该何时在Java中使用ArrayList,何时应该使用数组?
答案 0 :(得分:8)
一些差异:
a[i]
vs a.get(i)
)checkedList
,synchronizedList
和unmodifiableList
等Collections工具包ArrayList
声明为List
,您可以在需要时轻松地将实施与LinkedList
交换;这个imho是比普通数组更好的优势toString
,equals
和hashCode
很奇怪且容易出错,您必须使用Arrays类实用程序答案 1 :(得分:7)
另外两点:
答案 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)
天儿真好,
到目前为止人们似乎错过了几点。
编辑:哎呀。关于列表中的最后一点,我忘记了你有一个对象数组的特殊情况,然后这些数组也可以包含任何类型的对象。谢谢你的评论,Yishai! ( - :
HTH
欢呼声,