可能重复:
Benefits of arrays
嘿那里,
是否有理由更喜欢Arrays (MyObject[])
而不是ArrayLists (List<MyObject>)
?使用Arrays的唯一剩下的地方是原始数据类型(int,boolean等)。但是我对此没有合理的解释,只是让代码变得更加苗条。
一般情况下,我使用List来保持更好的灵活性。但是有没有理由使用真正的阵列?
我想知道, 最好的问候
答案 0 :(得分:13)
每当我知道我只会使用固定数量的元素时,我更愿意使用Array
s而不是ArrayList
s。我的理由主要是主观的,但无论如何我都在这里列出:
对于基元使用Collection
类的速度要慢得多,因为它们必须使用自动装箱和包装器。
我更倾向于使用更简单的[]
语法来访问ArrayList
get()
上的元素。当我需要多维数组时,这变得更加重要。
ArrayList
通常提前分配大约两倍的内存,以便您可以非常快速地追加项目。如果你永远不会再添加任何物品,那就有浪费。
(可能与前一点有关)我认为ArrayList
访问通常比普通数组慢。 ArrayList
实现使用底层数组,但所有访问都必须通过get()
,set()
,remove()
等方法,这意味着它会通过更多代码而不是简单的数组访问。但我实际上没有测试过差异,所以我可能错了。
话虽如此,我认为选择实际上取决于你需要它。如果您需要固定数量的元素,或者如果您要使用多个维度,我建议使用普通数组。但是如果你需要一个简单的随机访问列表并且要对它进行大量的插入和删除,那么使用Arraylist
答案 1 :(得分:1)
通常阵列存在问题,例如:类型安全:
Integer[] ints = new Integer[10];
Number[] nums = ints; //that shouldn't be allowed
nums[3] = Double.valueOf[3.14]; //Ouch!
他们也不能很好地收藏。因此,你应该更喜欢集合而不是数组。只有少数几个数组可能更方便。正如您已经说过原始类型是一个原因(尽管您可以考虑使用类似集合的库,如Trove)。如果数组隐藏在一个对象中而不需要改变它的大小,那么使用数组是可以的,特别是如果你需要所有的性能(例如3D和4D矢量和矩阵用于3D图形)。使用数组的另一个原因可能是您的API有很多varargs方法。
BTW:如果您需要匿名类的可变变量,那么使用数组有一个可爱的技巧:
public void f() {
final int[] a = new int[1];
new Thread(new Runnable() {
public void run() {
while(true) {
System.out.println(a[0]++);
}
}
}).start();
}
请注意,您不能使用int变量执行此操作,因为它必须是最终的。
答案 2 :(得分:0)
一个给你:
排序列表(通过j.u.Collections)首先转换为[],然后排序(再次克隆[]以进行合并排序),然后放回List。 您确实理解ArrayList在封面下有一个支持Object []。
回到当天有一个案例ArrayList.get没有被-client热点编译器内联,但现在我认为这是固定的。因此,与Object []相比,使用ArrayList的性能问题并不那么棘手,转换为适当类型的情况仍需花费几个时钟(但它应该是CPU预测时间的99.99%);访问ArrayList的元素可能会花费更多的缓存缺失(或主要是第一次访问)
所以它确实取决于您最终使用的代码。
修改强> 忘了你可以原子访问数组的元素(即CAS的东西),一个impl是j.u.c.atomic.AtomicReferenceArray。这不是最实用的,因为它不允许CAS of Objec [] []但不安全来救援。
答案 3 :(得分:0)
我认为数组和列表的主要区别在于数组具有固定长度。一旦它满了,它就满了。 ArrayLists具有灵活的长度,并且确实使用了数组。当arrayList超出容量时,数据将被复制到另一个容量更大的数组(这就是我曾经教过的内容)。
如果您的数据长度是固定的,仍然可以使用数组。因为数组非常原始,所以它们没有太多的方法可以调用。使用这些数组的优势不再那么大了,因为arrayLists只是你想要的Java或任何其他语言的好包装。
我认为你现在甚至可以为arraylists设置一个固定的容量,所以即使这种优势也会崩溃。
那么有理由更喜欢它们吗?不可能,但由于基本功能,它确实可以确保您的内存空间更大一些。 arraylist是一个非常大的包装器,具有很大的灵活性,你并不总是想要它。