ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java二维数组及其拷贝方式详解

2019-09-13 11:36:15  阅读:261  来源: 互联网

标签:Java int array2 System 详解 数组 拷贝 array out


原文链接:https://blog.csdn.net/qq_37232304/article/details/79950022

一、二维数组定义方式

//规则数组
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();
        }
    }


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

三、二维数组的拷贝


3.1.直接拷贝数组的地址

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

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

这里写图片描述

 

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

3.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);

结果为 :

这里写图片描述

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

原因:二维数组clone原理是将每一个一维数组array[x](地址或对象引用)赋值给目标,如下图所示: 

这里写图片描述

正确的拷贝方式:

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

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

3.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三种拷贝方式,对于基本类型的数组都是深拷贝,而对于引用类型的数组,他们都是浅拷贝。

四、拷贝结论

二维数组中浅拷贝特点:一位数组元素相同

        int[][] array = {{1,2,3},{4,5,6},{4,5}};
        int[][] array2 = array.clone();
        System.out.println(array);
        System.out.println(array2);
        System.out.println(Arrays.toString(array));//一维数组元素
        System.out.println(Arrays.toString(array2));

运行结果:

[[I@15db9742
[[I@6d06d69c
[[I@7852e922, [I@4e25154f, [I@70dea4e]
[[I@7852e922, [I@4e25154f, [I@70dea4e]

二维数组中深拷贝特点:一位数组元素不同

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

运行结果:

[[I@15db9742
[[I@6d06d69c
[[I@7852e922, [I@4e25154f, [I@70dea4e]
[[I@5c647e05, [I@33909752, [I@55f96302]

标签:Java,int,array2,System,详解,数组,拷贝,array,out
来源: https://blog.csdn.net/wangquan1992/article/details/100797746

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有