• 数组的拷贝和反转和扩容与缩减


    数组的拷贝

    前面说到了到了如果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);
    		}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    第二种实现方法:创建一个变量用于暂时存放值,(类似冒泡排序)将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);
    			}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    数组的扩容

    一般数组在静态定义完后是不可以更改的,但是我们可以通过其他方法来达到数组扩容的效果
    例如 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);
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    需求增加
    实现用户决定数组是否还要增加,并且增加的数字用户自己输入
    利用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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    数组的缩减

    数组的缩减与扩容相同思路,只不过从元素多的数组变成元素少的数组,将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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    低代码维格云甘特视图入门教程
    【微服务】Nacos初体验
    Scala第十六章节
    js介绍及内置功能函数、数据类型、变量
    基于蒙特卡洛法的规模化电动车有序充放电及负荷预测(Python&Matlab实现)
    java-php-python-ssm虚拟银行业务培训游戏计算机毕业设计
    Unity Joint用法及案例
    windows系统执行ps1(powershell)脚本文件无法识别命令的问题
    windows server批量创建用户
    趣解设计模式之《小王与他的Apple商店》
  • 原文地址:https://blog.csdn.net/WINorYU/article/details/126015354