如何更改数组的大小
简单的答案是你不能这样做。创建数组后,无法更改其大小。相反,只能通过创建具有适当大小的新数组并将现有数组中的元素复制到新数组来调整数组。
String[] listOfCities = new String[3]; // array created with size 3.
listOfCities[0] = "New York";
listOfCities[1] = "London";
listOfCities[2] = "Berlin";
假设(例如)需要将新元素添加到如上定义的 listOfCities
数组中。为此,你需要:
- 创建一个大小为 4 的新数组,
- 将旧数组的现有 3 个元素复制到偏移 0,1 和 2 的新数组中
- 将新元素添加到偏移量为 3 的新数组中。
有各种方法可以做到这一点。在 Java 6 之前,最简洁的方法是:
String[] newArray = new String[listOfCities.length + 1];
System.arraycopy(listOfCities, 0, newArray, 0, listOfCities.length);
newArray[listOfCities.length] = "Sydney";
从 Java 6 开始,Arrays.copyOf
和 Arrays.copyOfRange
方法可以更简单地做到这一点:
String[] newArray = Arrays.copyOf(listOfCities, listOfCities.length + 1);
newArray[listOfCities.length] = "Sydney";
有关复制阵列的其他方法,请参阅以下示例。请记住,在调整大小时,你需要一个与原始长度不同的数组副本。
阵列大小调整的更好替代方案
如上所述,调整数组大小有两个主要缺点:
- 效率低下。使数组更大(或更小)涉及复制许多或所有现有数组元素,并分配新的数组对象。阵列越大,它就越贵。
- 你需要能够更新包含对旧数组的引用的任何实时变量。
另一种方法是创建一个足够大的数组来开始。只有在分配阵列之前可以准确确定大小时,这才可行。如果你不能这样做,那么再次出现调整数组大小的问题。
另一种方法是使用 Java SE 类库或第三方库提供的数据结构类。例如,Java SE集合框架提供了具有不同运行时属性的 List
,Set
和 Map
API 的许多实现。ArrayList
类最接近普通阵列的性能特征(例如,O(N)
查找,O(1)
获取和设置,O(N)
随机插入和删除),同时提供更有效的大小调整而没有参考更新问题。
(ArrayList
的调整效率来自于每个调整大小的后备阵列大小加倍的策略。对于典型的用例,这意味着你只是偶尔调整大小。当你在列表的生命周期内分摊时,调整大小成本每个插入是 O(1)
。在调整普通数组的大小时,可以使用相同的策略。)