有关Java数组间赋值的问题

开发 后端
本文由作者在实际调试中出现问题解决问题,从而发现的Java数组间赋值的一些做法、技巧和需要注意的方面。

今天写个JAVA程序,老是出现错误,于是单步调试了很久,真的很久,NND ,几百行的程序调试了老半天了都,结果终于被我发现问题的说在了,不过费了这么多事,原来是一个JAVA的一个细节的东西在搞鬼,我是初学JAVA,对JAVA的了解也没有那么深入,所以它的特性也么有掌握好,不过今天被这些细节的东西整惨了。
大家都知道,在C 和C++中,数组是不能直接被赋值的,假设有两个数组 a[10],b[10],在C和C++中是不能以 a=b的方式把b中的内容赋值给相应的数组a的,因为a和b的值其实就是该数组的头指针指向的地址,当然如果很了解数组的实现原理的话,这就很好理解了,在《数据结果》的可能中有涉及到,总之知道数据的数组名就是数组的头指针指向的***元素的地址,如果能这样理解的话,那么用大腿想一下就知道a=b是不能实现数组的赋值的,一般在C和C++中我们采用了一个循环来单个赋值,类似这样的:

  1. for(int i=0;i<10;i++)   
  2. a[i]=b[i]; 

方式来实现,学了这么久的C和C++,用的多了,也不觉得费事。但是在JAVA中却不想C和C++一样,JAVA 很聪明,它可以使用 a=b 的方式来将b 赋值给a,这里的赋值要注意了,在JAVA中使用 a=b 的时候,在 a 中以数组的方式来输出内容的时候,跟b 的内容一模一样,说明这样的方式可行,我的程序里面就是这样用的,结果整出了BUG来了。一开始发现不管是用 a=b 还是用 a=a.clone(); 结果都是一样,有些不解,不过现在我完全清楚了。为了说明这个问题,以一段程序演示一下:

  1. private int[] subResources(int[] aa, int[] bb)  
  2. {  
  3.    // 做减法  
  4.    int []a=aa;  
  5.    int []b=bb;  
  6.    for (int i = 0; i < a.length; i++)  
  7.     a[i] = a[i] - b[i];  
  8.    return a;  

这是用来实现两个数组想减的函数,在调用的程序中这样使用

  1. int []allo=pcb0.getAllocation().clone(); //方式1  
  2.  
  3. //int []allo=pcb0.getAllocation()//方式2  
  4.    int[] allocation = this.addResources(allo, request); 

上面两种方式的参数传入带来的不同结果是,当你在函数addResources 修改了传入参数的值的时候,方式1不能改原来的数据,方式2能改变原来的数据。方式1它赋值的时候是先创建一个数组的副本,再把副本来给目标数组赋值,这样副本数组的地址和原来数组的地址当然不是同一个了,这样不管你怎么改,方式1它都不会改变原来的数据,方式2则不一样,方式2它直接将数据的地址赋值给目标数据,这样两个数组不同的数组名,其实指的都是同一个地址,这样当然可以改变原来的值了。

这样分析,它有点像C++中的函数传参中的 指针和引用传值一样,由于java中都摒弃了指针,所以所有的指向关系都使用了引用类型,用C++用久了就容易犯这样的错误。不像C++中这样传值 addResources (int *a,int *b) 或者 addResources (int a[],int b[]) 。这会吃亏了,看来这辈子在这个地方就这次了,学东西还得专注一点啊,现在明白了为什么招聘会上的基础题看起来简单,却不是每个人都能答好的。

责任编辑:仲衡 来源: 网易日志
相关推荐

2009-08-11 14:55:44

C#枚举

2010-02-07 11:13:04

Android设备间

2010-01-08 09:30:03

Java数组JVM

2020-02-04 14:07:47

Java技术开发

2009-07-02 17:39:46

Java未来

2010-05-05 17:53:56

web负载均衡

2010-07-08 12:49:12

SIP会话发起协议

2010-03-09 16:38:22

Linux grub启

2010-08-25 17:23:12

DHCP移植

2010-09-15 09:20:40

2021-07-26 05:20:47

JavaScript解构赋值数组解构

2009-12-17 11:47:44

FedoraJSP

2021-06-06 17:32:09

人脸识别AI人工智能

2024-01-29 00:30:00

C语言代码数组

2009-11-16 15:16:59

PHP数组

2009-08-13 13:03:52

C#结构体数组

2009-08-13 13:17:10

C#结构体数组

2009-11-17 09:02:36

PHP数组赋值

2009-06-11 17:03:29

Java线程

2009-06-11 14:47:09

排序Java list
点赞
收藏

51CTO技术栈公众号