• 【Java】数组的深浅拷贝问题(二维数组举例)(136)


    深拷贝和浅拷贝

    对于数组来说,深拷贝就是相当于拷贝了数组的对象(基本数据类型),也就是数组当中的内容。而浅拷贝就是拷贝的是数组的地址(引用类型),浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。

    数组的拷贝:数组拷贝有深拷贝和浅拷贝

    深拷贝:一般使用Arrays.copyOf() 方法,,深拷贝修改新的数组不改变原数组。
    浅拷贝:一般使用arr.clone() 方法,浅拷贝修改新数组和原数组。

    深浅拷贝二维数组举例

    package com.day02;
    
    import java.util.Arrays;
    
    public class day02 {
    	public static void main(String[] args) {
    		
    		String[][] arr = {{"10","20"},{"30","40","50"},{"60","70","80","90"}};
    		
    		for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    System.out.println("拷贝前原数组:"+arr[i][j]);
                }
            }
    		
    		System.out.println("--------------------------------------");
    		
    		//方式一:深拷贝二维数组(Arrays.copyOf):深拷贝修改新数组不改变原数组;
    		String[][] arr2 = new String[arr.length][];
    		
    		for (int i = 0; i < arr2.length; i++) {
    			arr2[i] = Arrays.copyOf(arr[i], arr[i].length);
            }
    		
    		for (int i = 0; i < arr2.length; i++) {
                for (int j = 0; j < arr2[i].length; j++) {
                	arr2[i][j] = arr2[i][j] + "%";
                }
            }
    		for (int i = 0; i < arr2.length; i++) {
                for (int j = 0; j < arr2[i].length; j++) {
                	System.out.println("深拷贝后新数组:"+arr2[i][j]);
                }
            }
    		System.out.println("---");
    		for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                	System.out.println("深拷贝后原数组:"+arr[i][j]);
                }
            }
    		
    		System.out.println("--------------------------------------");
    		
    		//方式二:浅拷贝二维数组(clone):浅拷贝修改新数组和原数组;
    		
    		String[][] arr3 = arr.clone();
    		
    		for (int i = 0; i < arr3.length; i++) {
                for (int j = 0; j < arr3[i].length; j++) {
                	arr3[i][j] = arr3[i][j] + "#";
                }
            }
    		for (int i = 0; i < arr3.length; i++) {
                for (int j = 0; j < arr3[i].length; j++) {
                	System.out.println("浅拷贝后新数组:"+arr3[i][j]);
                }
            }
    		System.out.println("---");
    		for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                	System.out.println("浅拷贝后原数组:"+arr[i][j]);
                }
            }
    		
    	}
    }
    
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    测试输出:

    拷贝前原数组:10
    拷贝前原数组:20
    拷贝前原数组:30
    拷贝前原数组:40
    拷贝前原数组:50
    拷贝前原数组:60
    拷贝前原数组:70
    拷贝前原数组:80
    拷贝前原数组:90
    --------------------------------------
    深拷贝后新数组:10%
    深拷贝后新数组:20%
    深拷贝后新数组:30%
    深拷贝后新数组:40%
    深拷贝后新数组:50%
    深拷贝后新数组:60%
    深拷贝后新数组:70%
    深拷贝后新数组:80%
    深拷贝后新数组:90%
    ---
    深拷贝后原数组:10
    深拷贝后原数组:20
    深拷贝后原数组:30
    深拷贝后原数组:40
    深拷贝后原数组:50
    深拷贝后原数组:60
    深拷贝后原数组:70
    深拷贝后原数组:80
    深拷贝后原数组:90
    --------------------------------------
    浅拷贝后新数组:10#
    浅拷贝后新数组:20#
    浅拷贝后新数组:30#
    浅拷贝后新数组:40#
    浅拷贝后新数组:50#
    浅拷贝后新数组:60#
    浅拷贝后新数组:70#
    浅拷贝后新数组:80#
    浅拷贝后新数组:90#
    ---
    浅拷贝后原数组:10#
    浅拷贝后原数组:20#
    浅拷贝后原数组:30#
    浅拷贝后原数组:40#
    浅拷贝后原数组:50#
    浅拷贝后原数组:60#
    浅拷贝后原数组:70#
    浅拷贝后原数组:80#
    浅拷贝后原数组:90#
    
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    ssm健康饮食推荐系统分析与设计毕业设计源码261631
    C语言最佳实践(B站学习)更新
    grid管理下的多实例配置不同监听端口
    Windows系统下几个占用C盘比较大空间的程序及位置
    SpringBoot-简介和入门案例
    MySQL数据库详解 一:安装MySQL数据库及基本管理
    【Java】多线程编程面试题总结
    划重点!CISA、FBI、NSA联合发布深度伪造威胁网络安全报告
    【STM32】SDIO—SD 卡读写01
    PowerBI 一些基础功能
  • 原文地址:https://blog.csdn.net/qq_42139049/article/details/133272723