简单的答案是不能直接修改java数组的大小。
一旦创建了数组,就无法更改其大小。
相反,数组只能通过创建具有适当大小的新数组并将元素复制到新数组来“调整大小”。
String[] listOfCities = new String[3]; //创建大小为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)。
在调整普通数组的大小时可能使用相同的策略。
)
日期:2020-06-02 22:15:18 来源:oir作者:oir