Java二维数组及其拷贝方式

原创 2018年04月15日 15:58:54

二维数组定义方式:

//规则数组
int[][]array=new int [2][3];//二维数组定义    
    int[][]array1={{1,2,3},{4,5,6}};
 int[][]array3=new int[][]{{1,2,3},{4,5,6}};
 //不规则数组
 int[][] array4 = new int[2][];
        array4[0] = new int[3];
        array4[1] = new int[2];

二维数组的遍历方式:
使用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();
        }
    }

forreach

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

使用for循环可以通过改变下标来访问不同的数组元素
forreach只能按顺序来访问数组中的每一个元素。

二维数组的拷贝:
1.直接拷贝数组的地址

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

此时是把array的地址给了array2,俩者指向同一块内存,所以,当其中一个数组的某个元素改变时,另一个数组的相对应元素也会发生改变。

这里写图片描述

2 for循环拷贝

对于基本类型

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];
            }
        }

这种拷贝是深拷贝,即把array数组的每一个元素都赋值给了array2数组,其中一个数组改变,另一个数组并不会改变。
对于引用类型


TestArray[][] t1 = new TestArray[2][3];
        for(int i = 0;i < t1.length;i++){
            for(int j = 0;j < t1[i].length;j++){
                t1[i][j] = new TestArray();
            }
        }

        TestArray[][] t2 = new TestArray[2][3];

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

这种拷贝是浅拷贝,即他只是把array数组内的地址赋给了array2数组,俩个数组的地址相同,即俩个数组都指向同一块内存,一个数组改变,另一个自然也会改变。

3 clone拷贝

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

        array2 = array.clone();
        show1(array);
        System.out.println("======");
        show1(array2);
        array2[0][0] = 1000;
        System.out.println("====改变==");
        show1(array);
        System.out.println("======");
        show1(array2);

结果为
这里写图片描述

由上图可以看出,当一个数组发生变化的时候,另一个数组也随之改变,但是在一维数组中并没有出现这种情况。原因如下图
这里写图片描述

正确的拷贝方式:

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

这种拷贝方式是一种深拷贝。

4 Arrays.copyOf与 Arrays.arraycopy

Arrays.arraycopy

int[][] array = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[2][3];
        for(int i = 0;i < array.length;i++){
            System.arraycopy(array[i], 0, array2[i], 
                    0, array[i].length);

Arrays.copyOf

int[][] array = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[2][3];
        for(int i = 0;i < array.length;i++){
        array2[i] = Arrays.copyOf(array[i],array[i].length);

对于基本类型的数组,Arrays.copyOf与 Arrays.arraycopy俩种拷贝方式,他们与clone拷贝方式一样,必须使用for循环进行拷贝,不然拷贝的只是地址,并没有拷贝到值。

与一维数组相同clone,Arrays.copyOf与 Arrays.arraycopy三种拷贝方式,对于基本类型的数组都是深拷贝,而对于引用类型的数组,他们都是浅拷贝。

对于深拷贝
这里写图片描述

对于浅拷贝

这里写图片描述

java开发控制台版的五子棋

-
  • 1970年01月01日 08:00

Java中二维数组和一维数组的clone

要实现深度复制,可以用clone或者System.arrayCopy 如下面的代码 1 int[] a={3,1,4,2,5}; 2 int[] b=a.clone(); 3 b[0]=10;...
  • WALLEZhe
  • WALLEZhe
  • 2015-12-23 14:47:29
  • 2799

【java】数组复制几种方式比较

import java.util.Arrays; /** * System.arraycopy方法的使用。 * 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束 */...
  • lzm18064126848
  • lzm18064126848
  • 2016-12-21 14:32:47
  • 674

Java中的二维数组和System.arraycopy

int [][] num = new int [3][5]; num[0][0] = 1; num[0][1] = 2; num[0][2] = 3; num[1][0] = 4; nu...
  • SushiPlus
  • SushiPlus
  • 2014-01-08 11:49:08
  • 2064

Java中数组的使用方法? 初始化,二维数组,数组复制

1.静态初始化:程序员指定初始值,系统决定长度。注意数组要使用new关键字。 class ArrTest { public static void main(String[] args) ...
  • dreamsnow127
  • dreamsnow127
  • 2012-03-13 18:19:49
  • 1753

Java二维数组及其拷贝方式

二维数组定义方式: //规则数组 int[][]array=new int [2][3];//二维数组定义 int[][]array1={{1,2,3},{4,5,6}}; i...
  • qq_37232304
  • qq_37232304
  • 2018-04-15 15:58:54
  • 23

java基础_day0016_数组_倒序_复制_二维数组

package day04; /** * @ClassName: ArrayTest.java * @Description: TODO(用一句话描述该文件做什么) * * @...
  • prefectjava
  • prefectjava
  • 2017-03-08 10:19:38
  • 329

二维数组及其拷贝方式

二分法查找 public static int search(int[] array,int val){ int low = 0;//左下标 int high...
  • Mars1997
  • Mars1997
  • 2018-04-15 02:27:28
  • 13

Java中的克隆clone以及对数组的复制

一、浅克隆和深克隆     1. 浅克隆(shadow clone)     只需要复制对象的字段值,对于8种基本类型,如int,long,float等,则复制值;对于复合数据类型仅复制该字段值,如数...
  • wxm349810930
  • wxm349810930
  • 2015-06-26 16:44:30
  • 403

二维数组的拷贝

/*本来是要写矩阵的压缩存储,但是变成了两个数组的拷贝,拷贝即需要利用两层for循环先输出再存入另一个数组中 屏蔽的部分本来是想控制相同元素的再次存入,节省空间的问题,但是输出的结果却还是数组中所有的...
  • OnePiece_only
  • OnePiece_only
  • 2016-09-11 22:25:31
  • 1063
收藏助手
不良信息举报
您举报文章:Java二维数组及其拷贝方式
举报原因:
原因补充:

(最多只允许输入30个字)