Java中实现数组动态扩容的两种⽅法
Java中实现数组动态扩容的两种⽅法
java中初始化⼀个数组需要定义数组的容量,⽽在我们使⽤数组时往往会遇到数组容量不够的情况,此时我们就需要通过动态扩容的⽅式来来根据需求扩⼤数组的容量。
我们可以通过两种⽅法来实现数组的动态扩容,⼀种是通过创建⼀个新的数组来覆盖旧数组,从⽽实现扩⼤数组容量的⽬的;另⼀种则是是通过java.util.Arrays类库来实现动态扩容。接下⾥我们分别对这两种⽅法进⾏分析。
⼀、新数组覆盖旧数组
当我们需要对数组进⾏扩容时,可以考虑不扩容数组本⾝,⽽是通过定义⼀个容量更⼤的数组,然后让原数组名称重新等于⼤数组即可。由于原数组数据在堆中,失去引⽤会被 GC ⾃动回收。⽰例如下:
public static void main(String[] args){
int[] arr ={1,3,4};//定义⼀个容量为3的数组arr
int[] arr2 =new int[arr.length+1];//定义⼀个新数组arr2,容量⽐arr⼤1
for(int i=0;i<arr.length;i++){//通过循环给新数组赋值
arr2[i]=arr[i];
}
arr = arr2;//新数组覆盖旧数组
System.out.println(arr.length);//打印结果为4,数组扩容成功
}
我们可以通过定义的新数组arr2的名称直接覆盖掉旧数组arr,原数组被⾃动回收,从⽽实现了数组的扩容,因此我们可以根据这个思路进⾏数组的动态扩容。⽬标如下:
定义⼀个容量为1的数组,将系统输⼊的内容添加到数组中,并每添加⼀次对数组进⾏⼀次扩容。
public static void main(String[] args){
Scanner input =new Scanner(System.in);
int[] arr =new int[1];//定义⼀个容量为1的数组arr
int i =0;
while(true){//通过死循环来观察多次动态扩容的结果
int x = Int();//接收int类型的输⼊
arr[i]= x;//将输⼊传递给数组arr
System.out.println(arr[i]);
int[] arr2 =new int[arr.length +1];//定义⼀个新数组arr2,容量⽐arr⼤1
//通过循环对新数组赋值
for(int j=0;j<arr.length;j++){
arr2[j]= arr[j];
}
arr = arr2;//新数组覆盖旧数组
i++;
System.out.String(arr));//打印数组内的值
}
}
输出的结果如下
⼆、调⽤Arrays类实现动态扩容
除了新数组覆盖旧数组的暴⼒扩容法外,我们还可以通过调⽤系统⾃带的java.util.Arrays类中的⽅法对数组进⾏动态扩容。Arrays类中实现数组扩容的⽅法为copyof。(需要导⼊java.util.Arrays)java定义一维数组并赋值
copyof⽅法的扩容原理为使⽤零复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度,调⽤格式为pyof(原数组名,扩容后的数组⼤⼩)。⽰例如下:
// An highlighted block
public class ArrayTest {
public static void main(String[] args){
int[] arr ={1,3,4};//定义⼀个容量为3的数组arr
arr = pyOf(arr,7);//将数组arr扩容到7
arr[6]=5;//给扩容后的数组下标6定义⼀个值
System.out.String(arr));//打印新数组
}
}
同样我们也使⽤Arrays类来实现数组的动态扩容,⽬标如下:
定义⼀个⼤⼩为1的数组,每次输⼊三个数字,按从⼤到⼩的顺序定义到数组中,数组不够的位置通过Arrays类来实现数组的扩容。
public static void main(String[] args){
Scanner input =new Scanner(System.in);
int i =3;
int[] arr ={1,3,4};//定义⼀个容量为3的数组arr
while(true){
System.out.println("请输⼊三个数字");//输⼊要添加的三个数字,分别定义为x1,x2,x3
int x1 = Int();
int x2 = Int();
int x3 = Int();
arr = pyOf(arr, arr.length +3);//将数组arr扩容3,并在扩容的位置分别赋值x1,x2,x3
arr[i]= x1;
arr[i+1]= x2;
arr[i+2]= x3;
i = i +3;
System.out.String(arr));//打印新数组
}
}
输出如下

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。