前面说到了到了如果arr2 = arr1相当于是地址引用,数组的空间是共享的
那么如果创建一个独立的空间但是存放的值又跟arr1一样呢
首先创建arr1
int [] arr1 = {1,2,3};
利用arr1.length创建和他一样大的空间并且创建arr2
int [] arr2 = new int[arr1.length];
接下来遍历数组arr1,依次将值赋给arr2
for(int a = 0;a
arr2[a]=arr1[a];
}
这样就完成了拷贝,就算修改arr2的值也不会影响arr1,因为他们是独立的空间
在数组的运用中会用到数组的反转,例如{1,2,3,4,5}反转成{5,4,3,2,1}
第一种实现方法:创建第二个数组,遍历数组从arr1的最高位下标往下遍历,依次赋值给arr2从最低下标
int [] arr1 = {45,56,67};
int [] arr2 =new int [arr1.length];
int a =0;
for (int i =arr1.length-1;i>=0 ;i-- ) {
arr2[a]=arr1[i];
a++;
}
for(int j:arr2)//快速遍历输出数组的方法
{
System.out.println(j);
}
第二种实现方法:创建一个变量用于暂时存放值,(类似冒泡排序)将arr1的最高位下标值赋值给第三方变量,然后将最低位下标的值给最高位下标,再把第三方变量的值给最低位下标,这样就完成了一次变换。其他的依次类推
此方法需要找规律比较复杂,但是可以减少占用内存不用创建第二个数组
int[]arr1={45,56,67,78,89};
arr1[0]和arr1[4]交换
arr1[1]和arr1[3]交换
arr1[2]不用换
交换次数为数组的length/2计算机中整数5/2等于2
交换的下标刚好是遍历当前下标和最高位下标-1-当前下标 也就是arr1[i]和arr1[arr1.length-1-i]交换
int [] arr1 = {45,56,67,78,89};
int num = 0;
for (int a =0;a<arr1.length/2 ;a++ ) {
num=arr1[arr1.length-1-a];//保存
arr1[arr1.length-1-a]=arr1[a];//低位给高位
arr1[a]=num;//高位给低位
}
for(int d:arr1){
System.out.println(d);
}
一般数组在静态定义完后是不可以更改的,但是我们可以通过其他方法来达到数组扩容的效果
例如 arr1 ={1,2,3,} 我们要让他变成{1,2,3,4}
首先创建一个新的数组arr2,空间定义成arr1.length+1,也就是比他多一个
再遍历arr1依次将arr1的元素给到arr2,遍历完成之后再把4给到arr2的最后一个下标。
最后将arr1的地址更改成arr2的空间地址,也就是引用传递arr1=arr2;这样之前arr1堆里开辟的空间由于没有变量指向它,就会自动被JVM回收掉。扩容完成
代码实现
int [] arr1 = {1,2,3};
int []arr2 =new int[arr1.length+1];
for (int a =0;a<arr1.length ;a++ ) {
arr2[a]=arr1[a];
}
arr2[arr2.length-1]=4;
arr1=arr2;
for (int c :arr2 ) {
System.out.println(c);
}
需求增加
实现用户决定数组是否还要增加,并且增加的数字用户自己输入
利用Scanner 和do while循环完成
注意定义arr1需要定义再循环体外否则会重置arr1
import java.util.Scanner;
public class ArrayAdd{
public static void main(String[] args) {
Scanner mysc=new Scanner(System.in);
int [] arr1 = {1,2,3};//注意定义需要定义再循环体外否则会重置arr1
do{
int []arr2 =new int[arr1.length+1];
for (int a =0;a<arr1.length ;a++ ) {
arr2[a]=arr1[a];
}
System.out.println("请输入增加的数");
int nnum = mysc.nextInt();
arr2[arr2.length-1]=nnum;
arr1=arr2;
for (int c :arr2 ) {
System.out.println(c);
}
System.out.println("是否需要继续增加y/n");
char key =mysc.next().charAt(0);
if (key=='n') {
break;
}
}while(true);
}
}
数组的缩减与扩容相同思路,只不过从元素多的数组变成元素少的数组,将arr1和arr2的位置互换一下即可。
例如每次缩减最后一个元素,只剩最后一个元素时提示无法再缩减
import java.util.Scanner;
public class ArrayAdd{
public static void main(String[] args) {
Scanner mysc=new Scanner(System.in);
int [] arr1 = {1,2,3,4};
do{
int []arr2 =new int[arr1.length-1];
for (int a =0;a<arr2.length ;a++ ) {
arr2[a]=arr1[a];
}
arr1=arr2;
for (int c :arr2 ) {
System.out.println(c);
}
if(arr2.length==1){
System.out.println("无法继续缩减");
break;
}
System.out.println("是否需要继续缩减y/n");
char key =mysc.next().charAt(0);
if (key=='n') {
break;
}
}while(true);
}
}