二维数组使用Arrays.copyOf带来的思维误区

1.问题描述

今天在一个java学习群里偶然看到一段代码,如下所示。
public static void main(String[] args) {
		int data [][] ={{1,2,3},{4,5,6},{7,8,9}};
		int dataTest[][];
		dataTest = Arrays.copyOf(data, data.length);
		dataTest[0][0] = data[2][2];			
		for (int i = 0; i < data.length; i++) {
			System.out.println(Arrays.toString(data[i]));
		}
	}

问题的发起人提出了疑问,打印结果是什么,为什么会这样?原理是什么。
一开始我简单看了下,没弄清楚他要问的具体是什么。简单看了下,不就是复制了个二维数组,然后修改了下元素值嘛。但是他的意思却是,为什么明明修改的是dataTest里的值,但是打印data里元素时也发生了改变?
这段代码的运行结果如下图:
一时间,我也没反应过来,陷入了思维误区,然后想来想去,难不成是Arrays.copyOf这个方法的问题?于是就去翻看了Arrays.copyOf的源码。

2.解决过程

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
于是我按照源码,将这个案例改写了如下所示
	public static void main(String[] args) {
		int data [][] ={{1,2,3},{4,5,6},{7,8,9}};
		int copy[][];
		System.out.println((Object)data.getClass() == (Object)Object[].class);
		copy = (int[][]) Array.newInstance(data.getClass().getComponentType(), 3);
        System.arraycopy(data, 0, copy, 0,Math.min(data.length, 3));		
		for (int i = 0; i < data.length; i++) {
			System.out.println(Arrays.toString(data[i]));
		}
	}
源码的大概意思是:先取得数组的Class对象,判断这个数组是否是Object类型的数组,如果是的话就创建个新的Object类型的数组,否则的话调用newInstance方法创建相同类型的数组。然后调用System.arrayCopy方法将原数组中的元素复制到新的数组中,并最终返回。
所以说,其实两个二维数组只是本身的地址值不一样,但是其中的元素是一样的。之所以会出现上面的思维误区,是因为忘了二维数组中存放的是一维数组的引用。
画个简单的内存图来看:


调用dataTest[0][0]=data[2][2],其实是修改了0x101数组中的元素值。data和dataTest中第一个元素指向的都是0x101这块区域。所以最终打印data数组,值也发生了改变,出现了上述的思维误区。

3.总结

其实出这个问题的最主要原因还是没搞清楚二维数组中存放的是每个一维数组的引用,而不是具体的元素值。不过通过这次小问题也看了看Arrays类中copyOf方法的源码,也算有一些收获。有时候学习就会陷入一种误区,知识点一综合,感觉被新的方法、新的技术绕进去了,但仔细想想,问题的本质出在哪儿,可能就是你忽略了的基础而已。。
编号 文件名称 cwts-specs-001 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:名语术语 cwts-specs-002 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:概述 cwts-specs-003 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:物理信道和传输信道到物理信道的映射 cwts-specs-004 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:信道编码与复用 cwts-specs-005 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:扩频与调制 cwts-specs-006 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:物理层过程 cwts-specs-007 IMT-DS FDD(WCDMA)系统无线接口物理层技术规范:物理层测量 cwts-specs-008 IMT-DS FDD(WCDMA)系统无线接口层2技术规范:物理层向上层提供的服务 cwts-specs-009 IMT-DS FDD(WCDMA)系统无线接口层2技术规范:MAC协议 cwts-specs-010 IMT-DS FDD(WCDMA)系统无线接口层2技术规范:RLC协议 cwts-specs-011 IMT-DS FDD(WCDMA)系统无线接口层2技术规范:PDCP协议 cwts-specs-012 IMT-DS FDD(WCDMA)系统无线接口层2技术规范:BMC协议 cwts-specs-013 IMT-DS FDD(WCDMA)系统无线接口层3技术规范:RRC协议 cwts-specs-014 IMT-DS FDD(WCDMA)系统Iu接口技术规范:概述 cwts-specs-015 IMT-DS FDD(WCDMA)系统Iu接口技术规范:层1技术要求 cwts-specs-016 IMT-DS FDD(WCDMA)系统Iu接口技术规范:信令传输 cwts-specs-017 IMT-DS FDD(WCDMA)系统Iu接口技术规范:RANAP信令 cwts-specs-018 IMT-DS FDD(WCDMA)系统Iu接口技术规范:数据传输和传输信令 cwts-specs-019 IMT-DS FDD(WCDMA)系统Iu接口技术规范:用户平面协议 cwts-specs-020 IMT-DS FDD(WCDMA)系统Iub接口技术规范:概述 cwts-specs-021 IMT-DS FDD(WCDMA)系统Iub接口技术规范:层1技术要求 cwts-specs-022 IMT-DS FDD(WCDMA)系统Iub接口技术规范:信令传输 cwts-specs-023 IMT-DS FDD(WCDMA)系统Iub接口技术规范:NBAP信令 cwts-specs-024 IMT-DS FDD(WCDMA)系统Iub接口技术规范:用于CCH数据流的数据传输和传输信令 cwts-specs-025 IMT-DS FDD(WCDMA)系统Iub接口技术规范:用于CCH数据流的用户平面协议 cwts-specs-026 IMT-DS FDD(WCDMA)系统Iur接口技术规范:概述 cwts-specs-027 IMT-DS FDD(WCDMA)系统Iur接口技术规范:层1技术要求 cwts-specs-028 IMT-DS FDD(WCDMA)系统Iur接口技术规范:信令传输 cwts-specs-029 IMT-DS FDD(WCDMA)系统Iur接口技术规范:RNSAP信令 cwts-specs-030 IMT-DS FDD(WCDMA)系统Iur接口技术规范:用于CCH数据流的数据传输和传输信令 cwts-specs-031 IMT-DS FDD(WCDMA)系统Iur接口技术规范:用于CCH数据流的用户平面协议 cwts-specs-032 IMT-DS FDD(WCDMA)系统Iub/Iur接口技术规范:用于DCH数据流的数据传输和传输信令 cwts-specs-033 IMT-DS FDD(WCDMA)系统Iub/Iur接口技术规范:用于DCH数据流的用户平面协议 cwts-specs-034 TD-SCDMA系统无线接口物理层技术规范 cwts-specs-035 TD-SCDMA系统无线接口层2技术规范 cwts-specs-036 TD-SCDMA系统无线接口层3-RRC技术规范 cwts-specs-037 TD-SCDMA系统Iu接口技术规范 cwts-specs-038 TD-SCDMA系统Iub接口技术规范 cwts-specs-039 TD-SCDMA系统Iur接口技术规范 cwts-specs-040 TD-SCDMA系统基站设备无线收发特性技术规范 cwts-specs-041 TD-SCDMA系统用户终端设备无线收发特性技术规范 CWTS发布的研究报告列表 cwts-reports-001 IMT-DS FDD(WCDMA)系统连接模式下的层间过程(25.303)标准研究报告 cwts-reports-002 IMT-DS FDD(WCDMA)系统空闲模式下UE的流程和连接模式下小区重选流程(25.304)标准研究报告 cwts-reports-003 IMT-DS FDD(WCDMA)系统无线资源管理RRM研究报告 cwts-reports-004 IMT-DS FDD(WCDMA)系统无线资源管理RRM研究报告 cwts-reports-005 IMT-DS FDD(WCDMA)系统UE无线接入能力研究报告
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值