好吧,在我看来,ArrayLists可以让以后更容易扩展代码,因为它们可以增长,因为它们使Generics更容易使用。但是,对于多维数组,我发现使用标准数组时代码的可读性更好。
无论如何,是否有关于何时使用其中一种的指导原则?例如,我即将从函数(int[][]
)返回一个表,但我想知道返回List<List<Integer>>
或List<int[]>
是不是更好。< / p>
答案 0 :(得分:7)
除非你有充分的理由,否则我建议使用Lists over arrays。
在某些特定情况下,您将需要使用数组(例如,当您实现自己的数据结构时,或者当您处理已经分析并确定为瓶颈的非常具体的性能要求时)但是目的列表更方便,并为您提供更灵活的使用方式。
在你能够的地方,我还建议编程到抽象(List)而不是具体类型(ArrayList)。同样,如果您决定在将来改变实施细节,这将为您提供灵活性。
为了解决您的可读性问题:如果您有一个复杂的结构(例如,ArrayLists的HashMaps的ArrayList),那么考虑将这种复杂性封装在一个类中和/或创建一些非常清楚命名的函数来操作该结构。
答案 1 :(得分:3)
根据主要用途选择数据结构实施和界面:
随机访问:使用列表作为变量类型,并使用 ArrayList
追加:使用集合作为变量类型,并使用 LinkedList
循环和处理:使用 Iterable 并根据生产者代码查看以上内容以供使用
在处理数据时,可以使用最抽象的接口。也就是说,当您需要随机访问时,请不要使用 Collection 。 列表具有 get(int),这在需要随机访问时非常有用。
List&lt; String&gt; 等类型集合弥补了数组的语法便利。
除非您有合格的效果专家分析并推荐它们,否则不要使用数组。即便如此,你应该得到第二个意见。数组通常是不成熟的优化,应该避免使用。
一般来说,使用界面而不是具体类型会好得多。具体类型使得难以重新修改所讨论功能的内部。例如,如果返回int [] [],则必须预先执行所有计算。如果您返回List&gt;如果有益的话,你可以在迭代期间(或者甚至在后台同时)懒惰地进行计算。
答案 2 :(得分:1)
List
更强大:
Set
或Map
。阵列在较低级别上工作:
答案 3 :(得分:1)
我想指出Lists可以保存原始数据类型的包装器,否则这些包装器需要存储在数组中。 (即只有一个字段的类Double:一个double)较新版本的Java至少在大多数情况下隐式地转换到这些包装器和从这些包装器转换,因此将基元放在列表中的能力不应该是绝大多数用例。
为了完整性:我唯一一次看到Java无法从原始包装器隐式转换的时候是那些包装器是以更高阶的结构组成的:它无法将Double []转换为double []。
答案 4 :(得分:0)
主要归结于灵活性/易用性与效率。如果您不知道预先需要多少元素,或者您需要在中间插入,则ArrayLists是更好的选择。我相信他们会使用Arrays,因此您需要考虑使用ensureCapacity
方法来提高性能。如果您事先拥有固定大小且不需要插入等,则首选阵列。