Java数组的三种扩容方式以及程序实现详解
为什么需要数组扩容
在 Java 中,数组的长度是固定的,一旦数组被创建,它的大小就不能再改变了。在一些场景下,我们需要在运行时动态地改变数组的大小,那么就需要用到数组扩容。
例如,我们开发一个数组队列,数组队列的底层实现是数组。如果元素个数超过了数组的初始长度,就需要对数组进行扩容,否则会导致队列无法继续存入元素。
Java数组的三种扩容方式
Java的数组无法自动扩容,但是我们可以通过手动实现扩容操作,一般有以下三种方式:
System.arraycopy实现数组扩容
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 是 Java 中一个将源数组中指定位置的元素复制到目标数组中的方法,其中 src 指定源数组,srcPos 指定源数组中从哪个位置开始复制,dest 指定目标数组,destPos 指定目标数组从哪个位置开始存放复制的元素,length 指定要复制的元素个数。我们可以利用该方法实现数组的扩容,示例如下:
// 初始化数组
int[] oldArray = new int[]{1,2,3};
// 对数组进行扩容,新长度为5
int[] newArray = new int[5];
System.arraycopy(oldArray, 0, newArray, 0 , oldArray.length);
Arrays.copyOf实现数组扩容
Arrays.copyOf 允许我们将一个数组的全部或部分拷贝到一个新数组中,并且可以指定新数组的长度。如果新数组的长度大于原数组的长度,则会在新数组的尾部用 null、0 或 false(具体根据数组类型决定)填充;如果新数组的长度小于原数组的长度,则会将原数组中多余的部分截断。我们可以利用该方法实现数组的扩容,示例如下:
// 初始化数组
int[] oldArray = new int[]{1,2,3};
// 对数组进行扩容,新长度为5
int[] newArray = Arrays.copyOf(oldArray, 5);
手动实现数组扩容
我们可以手动实现数组的扩容。首先需要创建一个新的数组,然后将原数组中的元素逐个复制到新数组中。这种方式可以自定义扩容的算法,例如可能会根据实际情况决定数组长度增加的倍数,示例如下:
// 初始化数组
int[] oldArray = new int[]{1,2,3};
// 对数组进行扩容,新长度为5
int[] newArray = new int[5];
for (int i = 0 ; i < oldArray.length ; i ++) {
newArray[i] = oldArray[i];
}
总结
Java 数组没有自动扩容的机制,需要手动进行扩容。可以使用 System.arraycopy, Arrays.copyOf 或手动实现数组扩容。三种方式中,System.arraycopy 是性能最优的,Arrays.copyOf 更加简洁易懂,手动实现则可以自定义扩容算法。对于 ArrayList 等 JDK 自带的容器,也是采用了类似的机制实现数组的自动扩容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java数组的三种扩容方式以及程序实现详解 - Python技术站