二维数组的扩展

1.二维数组的含义

由行和列组成的表格,尤其对于二维数组而言,无非就是一个一维数组,只不过该一维数组中的每一个元素是另一个一维数组。

2.二维数组的创建

2.1 创建一个3行3列的二维数组,元素默认都是0

int[][]  matrix=new int[3][3];

2.2 创建一个指定元素的二维数组(两种方法)

int[][] matrix=new int[][]{   {1,2,3} ,{5,6,7} ,{9,10,12} };

int[][] matrix={  {1,2,3,4} ,{5,6,7,8} ,{9,10,11,12} };

3.二维数组的应用

import java.util.*;
class Demo57{
    public static void main(String[] args){
        //调用函数实现数组的赋值
        int[] list1=fun();
        int[] list2=fun();
        //打印两个数组合并的升序数组,转换成字符串输出
        System.out.println(Arrays.toString(merge(list1,list2)));
    }
    /*
    有序数组的合并
    最主要的问题在于 数组之间有长有短
    */
    public static int[] merge(int[] list1,int[] list2){
        //判断两个字符串是否为空,为空的话结束
        if(list1==null&&list2==null){
            return null;
        }
        //判断两个字符串中是否有空,有空的话返回另外一个
        if(list1==null){
            return list2;
        }
        //判断两个字符串中是否有空,有空的话返回另外一个
        if(list2==null){
            return list1;
        }
        //只有两个都不是null的情况再考虑具体操作
        int[] list3=new int[list1.length+list2.length];
        int p1=0;
        int p2=0;
        int p3=0;
        while(true){
            //只有当两个数组的长度都遍历完,才结束
            if(p1==list1.length&&p2==list2.length){
                break;
            }
            //如果list2数组遍历完,直接把list1后面的元素放到list3中
            if(p1<list1.length&&p2==list2.length){
                list3[p3++]=list1[p1++];
                //如果list1数组遍历完,直接把list2后面的元素放到list3中
            }else if(p1==list1.length&&p2<list2.length){
                list3[p3++]=list2[p2++];
            }else{
                //其余的情况就是两个数组当中的元素比较大小,一次往list3放
                if(list1[p1]<=list2[p2]){
                    list3[p3++]=list1[p1++];
                }else{
                    list3[p3++]=list2[p2++];
                }
            }
        }
        return list3;
    }
    public static int[] fun(){
        //提示用输入两个数组,进行数组的赋值
        System.out.println("请输入两个数组,每次以零结束:");
        Scanner scanner=new Scanner(System.in); 
        int[] arr=new int[0];
        while(true){
            int num=scanner.nextInt();
            if(num==0){
                break;
            }
            arr=kuoChong(arr,arr.length+1);
            arr[arr.length-1]=num;
        }
        return arr;
    }
    public static int[] kuoChong(int[] arr,int newlen){
        //对原来数组的扩充
        int[] newarr=new int[newlen];
        for(int i=0;i<arr.length;i++){
            newarr[i]=arr[i];
        }
        return newarr;
    }
}
/*
举例:
请输入两个数组,每次以零结束:
4 6 7 8 12 46 68 0
请输入两个数组,每次以零结束:
2 3 6 16 18 28 32 88 0
[2, 3, 4, 6, 6, 7, 8, 12, 16, 18, 28, 32, 46, 68, 88]
*/

4. 数组作为引用数据类型和基本数据类型的用法

4.1   基本数据类型传参 传的是常量在常量池中的地址
        引用数据类型传参 传的是对象在堆内存中的地址
        记住一点,实参——>形参 传的永远是地址

4.2   基本数据类型 是原子型数据 就是不可再拆分
        引用数据类型 是复合型数据 当前对象数据中,其实还包括了其他更多的子数据
        int a,b,c;-> arr [a,b,c]
        复合型数据: 指的就是由多个基本数据或其他引用数据组成的一个数据

4.3  形参变量永远不可能去改变实参中已储存的数据地址 除非return 实参且接收
        就算形参变量所存储的数据地址被改变 那也是改变形参自己 与实参无关
        无非是:
            实参本身指向的是一个对象
            然后把这个对象的地址传递给了形参
            形参就可以通过该地址去堆内存中找对象,可以修改对象中的数据
            实参再去访问对象时,对象中的数据就已经被改变
            因为实参和形参目前使用操作的都是同一个对象

4.4 终结总结:
        无论实参还是形参 实参就是把变量空间所存的地址给了形参而已
        他们都是变量!
        所以对于变量的修改而言,主要分两种!
        1.要么改变该变量空间所存储的地址
        int a=3;  
        a=7;
        int[] arr=new int[]{1,2,3};
        arr=new int[]{3,2,1};
        2.要么改变该变量空间所存储的地址所指向的那个对象中的数据
        int[] arr=new int[]{1,2,3};
        arr[0]=10;  
        对与基本数据类型而言,能否支持2操作 不能
       

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值