数组“扩容”
1.定义完成的数组是不能在该数组的基础上进行扩容的,因为数组长度定义后不能改变。
数组“扩容”实际上指的是复制原数组,创建一个新的数组副本,并定义其长度,这样就实现了字面意义上的扩容。
public class T2 {
public static void main(String[] args) {
int[] arr = new int[2];
System.out.println(arr);
System.out.println(Arrays.toString(arr));
//括号里的参数是原数组名称和新数组的长度
arr = Arrays.copyOf(arr,4);
System.out.println(arr);
arr[2] = 1;
arr[3] = 2;
System.out.println(Arrays.toString(arr));
}
}
输出结果为:
[I@1b6d3586
[0, 0]
[I@4554617c
[0, 0, 1, 2]
由结果可知,引用arr指向的地址发生了改变。因此数组“扩容”的本质是创建新数组,在堆内存开辟新的空间。
方法copyOf()源码如下:
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
2.相关案例
实现功能:最初数组里只有元素“你好”,请利用数组扩容实现可以无限次输入内容并打印出数组里的内容,输入为空时程序结束。
public class T3 {
public static void main(String[] args) {
String[] s = {"你好"};
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入内容:");
String s1 = sc.nextLine();
if ("".equals(s1)){
break;
}
s = Arrays.copyOf(s,s.length+1);
s[s.length-1] = s1;
System.out.println(Arrays.toString(s));
}
}
}
运行结果:
请输入内容:
小明
[你好, 小明]
请输入内容:
小红
[你好, 小明, 小红]
请输入内容:
小兰
[你好, 小明, 小红, 小兰]
请输入内容:
Process finished with exit code 0