当数组定义完成后,数组存储元素的个数就确定了,因为在定义数组时,要指定数组的长度. 如果想要在数组中存储更多的数据, 就需要对数组扩容。本文就来为大家介绍Java数组扩容的相关知识。
想要掌握Java数组扩容,必须要先了解数组扩容的一些特性:
1)Java数组对象的大小是固定不变的,数组对象是不可扩容的。
2)利用数组复制方法可以变通的实现数组扩容。
3)System.arraycopy()可以复制数组。
4)Arrays.copyOf()可以简便的创建数组副本。
5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容。
package com.wkcto.chapter03.demo01;
import java.util.Arrays;
/**
* 数组扩容
* @author 蛙课网
*
*/
public class Test06 {
public static void main(String[] args) {
// m1(); //完全手动扩容
// m2(); //数组复制调用 了System.arraycopy(0方法
m3(); //调用 Arrays.copyOf(0实现扩容
}
private static void m3() {
// 定义长度为5的数组
int[] data = { 1, 2, 3, 4, 5 };
// 想要在数组中存储更多的数据,需要对数组扩容
//Arrays工具类copyOf(源数组, 新数组的长度) 可以实现数组的扩容
data = Arrays.copyOf(data, data.length*3/2);
System.out.println( Arrays.toString(data));
}
private static void m2() {
//定义长度为5的数组
int [] data = {1,2,3,4,5};
//想要在数组中存储更多的数据,需要对数组扩容
//(1) 定义一个更大的数组
int [] newData = new int[data.length * 3 / 2] ; //按1.5倍大小扩容
//(2)把原来数组的内容复制到新数组中
//把src数组从srcPos开始的length个元素复制到dest数组的destPos开始的位置
// System.arraycopy(src, srcPos, dest, destPos, length);
System.arraycopy(data, 0, newData, 0, data.length);
//arraycopy()方法使用了native修饰,没有方法体, 该方法的方法体可能是由C/C++实现的
//JNI,Java native Interface技术,可以在Java语言中调用其他语言编写的代码
//(3) 让原来的数组名指向新的数组
data = newData;
//
System.out.println( Arrays.toString(data));
}
private static void m1() {
//1)定义长度为5的数组
int [] data = {1,2,3,4,5};
//2)想要在数组中存储更多的数据,需要对数组扩容
//(1) 定义一个更大的数组
int [] newData = new int[data.length * 3 / 2] ; //按1.5倍大小扩容
//(2)把原来数组的内容复制到新数组中
for( int i = 0 ; i < data.length; i++){
newData[i] = data[i];
}
//(3) 让原来的数组名指向新的数组
data = newData;
//
System.out.println( Arrays.toString(data));
}
}
在编写一些非参学习算法时,例如DP和HDP,经常会遇到生成新簇的情形,这种情况下,数组的空间就不够用了,需要对原来的数组进行扩容。
例如:
int K=10;
int[] tables = new int[K]; //可以看出该数组最多可存储10个元素
for (int i = 0; i<k; p="" {<="">
tables [i] = i; //数组赋值
}
如何让上面已经赋值的数组扩展到可存储11个元素、12个元素等等呢?
针对二维数组,如下:
int C =10;
int[][] tablesNum = new int[C][10];
for (int i = 0; i < tablesNum.length; i++) {
for (int j = 0; j < tablesNum[i].length; j++) {
tablesNum[i][j] = i*j; //二维数组赋值
}
}
可以看出该二维数组最多存储100个元素,如何让其存储更多的元素呢?
解决程序
如下我提供了针对一维数组和二维数组扩容的方法,主要使用的是:System.arraycopy()方法。
//将数组放大,确保不越界
public static int[] ensureCapacity(int[] arr,int i) {
int length = arr.length;
int[] arr2 = new int[length+i];
System.arraycopy(arr, 0, arr2, 0, length);
return arr2;
}
//将数组放大,确保不越界
public static int[][] ensureCapacity(int[][] array,int i,int j) {
int[][] arr = new int[array.length +i][array[0].length +j];
//扩展
for(int c = 0; c< array.length; c++) {
//数组拷贝
System.arraycopy(array[c], 0, arr[c], 0, array[c].length);
}
return arr;
}
以上就是Java数组扩容的相关知识,通过本文中的实例讲解,大家对Java数组扩容的疑问应该一扫而空了。想要学习更多的Java数组相关知识可以观看本站的Java基础教程,全方位为你打好Java基础。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习