我相信数组和数组列表都是非同步的;在多线程环境中表现相同。两者都是基于索引的。唯一的优点是ArrayList有实用的方法和灵活性。
除了那些实用程序方法,只有获得和设置固定的对象,这是最好的java?使用数组列表比使用数组有任何开销吗?请解释。
让我们考虑像
这样的场景1)要存储的100,000个对象。2)存储100,000个原语
为了能够回答哪种数据表示更适合的问题,需要了解许多细节,例如:
- 结构中将存储多少元素?
- 结构是可变的还是不可变的,也就是说,它的内容在初始化后会改变吗? 当你初始化结构时,你知道它的最终大小吗?
- 如何访问元素?迭代它?按索引随机访问?
- 等。
关于数组与数组列表:数组列表的性能开销是最小的,在大多数情况下它并不显著。另一方面,它更灵活。参见Java中的数组或列表线程。哪个更快?
数组列表的开销会比数组稍微高一些。这是因为ArrayList只是一个数组的包装器,添加了一些方便的方法。但是,如果你确切地知道你将有多少个元素,那么ArrayList并没有增加多少。
数组相对于ArrayList(至少在Java中)的最大优点是语法更简洁。如:myArray[0] = x;
// as opposed to
myList.set(0, x);
// personally I can never remember the order for the arguments and I have to check
将所有元素添加到另一个列表
数组列表的一个可能的优点是可以很容易地将一个数组列表中的所有元素添加到另一个列表中。
anotherList.addAll(myList);
然而,同样可以通过使用Collections
util类轻松完成。
Collections.addAll(anotherList, myArray);
不变性
一个问题是数组是可变的(元素值可以改变),但是您可能只想将元素集合的不可变视图呈现给您自己类之外的类。在这里,列表可以再次发挥作用。
List<E> readOnly = Collections.unmodifiableList(myList);
但是在这种情况下,数组仍然可以很容易地用来支持不可变列表。
List<E> readOnly = Collections.unmodifiableList(Arrays.toList(myArray));
最后,也是最重要的,您可以使用Collections类来同步列表。
List<E> syncedList = Collections.synchronizedList(myList);
你可以把数组包装在一个列表中,并使访问同步,但这样你仍然必须使用通过列表的访问,所以使用数组没有多大意义。
结束语-个人偏好
总的来说,整个事情归结为偏好。你的个人偏好是什么,你更喜欢使用数组还是列表?就我个人而言,我更喜欢列表,因为它们可以更好地与其他集合API一起工作,并且制作泛型列表很容易,制作泛型数组是一个真正的痛苦。
List<E> list = new ArrayList<E>(); // easy
E[] array = new E[]; // compilation error
ArrayList在内部使用Array。是的,数组列表有一些开销,但它提供了一些方便的方法来访问列表中的元素。这取决于你喜欢什么
如果对象的数量是固定的,显然Array是更好的解决方案。因为ArrayList使用的数组可以在添加过程中创建多次。正如javadoc在数组列表函数
中所说每个ArrayList实例都有一个容量。容量为的大小用于存储列表中元素的数组。它总是在至少和列表大小一样大。元素被添加到