一、应用需求
在日常工作学习中,我们经常会遇到一个问题:在创建一个用户需要的数组时,如果我们或是用户并不能确定数组长度,这时候我们无论是将长度设置为多少,都有可能出现容量不足或是浪费过多空间的情况。此时我们就可以考虑使用数组拓展了。
二、基础概念
在学习数组拓展前,我们需要清楚,一旦数组被创建,那么它的长度即容量无法被改变!而数组拓展能够对数组长度进行延伸的本质是:令系统创建一个长度(具体长度视情况而定)大于原数组(后用Arrayold表示)的新数组(后用Arraynew表示),
然后将Arrayold中的元素全部复制到Arraynew中,最后将Arraynew的地址交给Arrayold中,后续则重复此步骤即可实现无视数组长度进行输入(若用户输入数组长度和Arraynew数组长度相差过多会影响运行效率)。
三、核心代码
private void checkCapacity(int needCount){//用来进行容器扩容
//needCount为用户输入的还需要的数组数量,因为用户也许不止需要拓展一次
//index为下一次元素的存储位置,也是目前为止数组的长度
if(index+needCount>elements.length){
//如果原数组剩余数量+用户还需要的数量>原数组长度
//则需要进行扩容
int newLength=elements.length*2;
/*
考虑到用户所需长度与扩容长度可能过大
若新数组长度为原数组长度的2倍仍无法满足需求
则直接令新数组长度为用户所需数组长度加上原数组长度
以满足不同用户的需求
*/
if(newLength<needCount+index){
newLength=needCount+index;
}
Object[] newArray = new Object[newLength];
/*
使用Object类型是因为用户所传的是未知类型的元素
若只是使用基本类型的元素进行存储,直接使用基础类型的数组即可
*/
for(int i=0; i<index; i++){//通过循环赋值
newArray[i] = elements[i];
}
elements = newArray;//将新数组地址传给原数组,便可通过原数组地址使用到新数组长度
}
}
一般来说会将数组拓展内容写在方法中,以保证每次结束方法后,新数组都会被系统释放,于是我们借此可以循环使用数组拓展方法,不断地使用和拓展数组长度。
四、实验例题
当然,数组拓展内容也可以不写在方法中。该例题只是简单的验证了数组拓展的可行性,因此没有一次输入多个内容的可能,同时并未使用方法。
由用户无限输入数组,输入的内容不能重复,直到用户输入"0"时停止输入并输出用户输入的数组。
import java.util.Scanner;
public class Array_{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int number=-1;
//number不只是存储用户输入内容的变量,也是控制while循环的关键
int[] array=new int[3];//此时数组大小可合理安排
System.out.println("请输入数组:");
System.out.println("输入0结束输入");
b:while(true){
a:for(int num=0;num<array.length;num++){
//当输入内容重复时,continue控制运行至此重新输入
number=scanner.nextInt();
if(number==0){
break b;//当用户输入为0时,直接跳出while循环
}
for(int i=0;i<num;i++){//循环遍历之前的内容判断是否有相同的元素
if(number==array[i]){
System.out.println("请重新输入!");
continue a;//当用户输入内容重复时,重新输入
}
}
array[num]=number;
//下面进行数组拓展
if(num==array.length-1){//当数组下标已经移动至末尾时,进行数组拓展
int[] nums=new int[array.length+3];
for(int j=0;j<array.length;j++){
nums[j]=array[j];
}
array=nums;
System.out.println("完成数组拓展");//以此证明完成了数组拓展
}
}
}
System.out.println("以下是输入的数组");
for(int num=0;num<array.length;num++){
if(array[num]!=0){
System.out.print(array[num]+" ");
}
}
System.out.println();
}
}
输入样例:1 2 3 4 5 6 7 8 9 1 0
//输入到"3","6","9"时终端输出"完成数组拓展",输入1时终端输出"请重新输入!"。
输出结果:
以下是输入的数组
1 2 3 4 5 6 7 8 9