我想知道数组的缺点是什么。我认为,了解数组是否是在特定情况下存储数据的最佳方式或预测执行时间非常有用。
编辑1:根据我理解的数组澄清:
java.util.Arrays
中,您甚至不包含基本数组操作方法,如 union 和交集。令人遗憾的是,guava库并不是标准Java的一部分。例外情况和重要说明。
在我看来,数组是存储数据的最佳方式之一,而不是直接存储。有时候,我的脑袋似乎就像一个垃圾桶,知识不正确。这就是我提出这个问题的一个原因 - 确认我所知道的。
答案 0 :(得分:5)
从Java5开始,数组很少是存储数据的最佳方式 - 泛型集合几乎总是优越的:
List<T>
,还可以使用List<? extends T>
和List<? super T>
,而不是T[]
(相应的三个变体中的第二个,而不是第一个)List<String>
不 a List<Object>
- 这可以避免许多运行时异常,因为编译器可以检测到它们并提供错误消息ArrayList
,但是如果你需要关联,有序,优先级,唯一值,线程安全,不可变等存储,你将难以使用数组contains
List<String>[]
答案 1 :(得分:4)
您还应该了解数组的优势,并且还有一些。
原始类型的数组通常每个元素占用的空间明显少于相应包装类型的集合。这部分是由于包装器对象的开销(取决于它们的创建方式),部分原因是JVM通常将布尔值,字节,字符和短路2,4或8存储到数组中的机器字中
所有类型的数组的每个数组空间开销都小于集合类型。例如,ArrayList实际上是一个包含在具有2个字段的另一个对象中的对象数组。
数组访问和更新比同等集合get
和set
操作快一点。
现在,这些空间/性能差异通常不值得担心。 (集合的灵活性和便利性超过了它们。)但是,在一些数据密集型应用程序中,这些差异可能很大。
答案 2 :(得分:3)
可能最容易将它们与替代品的优势进行比较:
<强> VS。 ArrayList<T>
强>
添加和删除元素更方便。除了最后添加,大多数操作与数组一样慢(和快)。
<强> VS。 LinkedList<T>
强>
添加和删除元素要快得多,通过索引获取元素的速度非常慢。
vs HashSet<T>
更快contains
,add
和remove
次操作。丢失元素排序。
vs HashMap<TKey, TValue>
允许您通过索引以外的方式快速访问元素。丢失元素排序。
答案 3 :(得分:1)
总体缺点:
int
作为索引。没有数组可以包含超过2^31 - 1
个元素