10-咸鱼学Java-Java中的二维数组

二维数组的定义和初始化

        //规则数组
        int[][] a = new int[2][3];
        int[][] a2 = {{1,2,3},{4,5,6}};
        int[][] a3 = new int[][]{{1,2,3},{4,5,6}};
        //不规则数组
        int[][] a4 = new int[2][];
        a4[0] = new int[3];
        a4[1] = new int[2];

3种初始化方式其中a2和a3都已初始化,a和a4需要一个元素一个元素赋值。

        a[i][j] = k;

数组的遍历

1.for

    public static void show1(int[][] array){
        for(int i = 0;i < array.length;i++){
            for(int j = 0;j < array[i].length;j++){
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
    }

2.foreach

    public static void show2(int[][] array){
        for( int[] brr: array ){
            for(int i:brr){
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }

第一种为for循环的方式,for循环的好处是每次通过下标访问,所以可以通过改变下标来访问不同的元素。
第二种方式为增强for循环,foreach循环方便了开发,可是foreach并不能控制数组的下标,只会按顺序获取每个元素,然后进行处理。
总体而言每个都有其好处,也有其坏处,所以应该根据情况进行使用。

二维数组的拷贝

1.直接copy地址

        int[][] array = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[2][3];
        array2 = array;

array2改变,array也会改变因为他们指向同一块内存空间。
如图
这里写图片描述
2.直接copy
对于基本类型

        int[][] array = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[2][3];

        for(int i = 0;i < array.length;i++){
            for(int j = 0;j < array[i].length;j++){
                array2[i][j] = array[i][j];
            }
        }

这种方式是深拷贝,因为是把每一个基本元素的值赋给了array2数组
这里写图片描述

3.clone拷贝
此处有坑,从7-咸鱼学Java-Java中的数组中可以看出,clone方法可以直接clone数组
此处进行实验

    int[][] a = {{1,2,3},{4,5,6}};
    int[][] b = new int[2][3];
    b = a.clone();
    show1(a);//可以打印数组的函数
    show1(b);
    System.out.println("改");
    a[0][0] = 10086;
    show1(a);
    show1(b);

结果
1 2 3
4 5 6
++++++++++++++++++++++++
1 2 3
4 5 6
++++++++++++++++++++++++

10086 2 3
4 5 6
++++++++++++++++++++++++
10086 2 3
4 5 6
++++++++++++++++++++++++

在一维数组中改变并不会使原数组发生变化,原因是什么呢?
这里写图片描述
因为你clone的是二维数组中存储地址的哪一个维度,所以其实他们指向的数据域是一块区域,所以当你改变a的时候,b会跟着改变
正确的clone为

    int[][] a = {{1,2,3},{4,5,6}};
    int[][] b = new int[2][3];
    for (int i = 0; i < a.length; i++) {
        b[i] = a[i].clone();
    }
    show1(a);
    show1(b);

    System.out.println("改");
    a[0][0] = 10086;
    show1(a);
    show1(b);

结果
1 2 3
4 5 6
++++++++++++++++++++++++
1 2 3
4 5 6
++++++++++++++++++++++++

10086 2 3
4 5 6
++++++++++++++++++++++++
1 2 3
4 5 6
++++++++++++++++++++++++

4.System.arraycopy
详情见7-咸鱼学Java-Java中的数组-3.4
其copy的时候也不能直接copy也需要通过for循环循环copy,要不然就像上面一样,只拷贝了地址维度,并没有copy到值。
5.Arrays.copyOf
详情见7-咸鱼学Java-Java中的数组-3.5
其余特性同上。
二维数组的copy和一位数组相同,对于引用类型来说,copy的都为地址,所以都是浅拷贝,对于基本类型来说都是深拷贝

阅读更多

扫码向博主提问

咸鱼塘塘主

沉迷学习
去开通我的Chat快问
版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/qq_38345606/article/details/79945954
个人分类: 零基础学Java Java
所属专栏: 咸鱼学Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭