欢迎来到天天文库
浏览记录
ID:52315450
大小:24.00 KB
页数:2页
时间:2020-03-26
《有关Java数组间赋值的问题.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、有关Java数组间赋值的问题本文由作者在实际调试中出现问题解决问题,从而发现的Java数组间赋值的一些做法、技巧和需要注意的方面。 今天写个JAVA程序,老是出现错误,于是单步调试了很久,真的很久,NND,几百行的程序调试了老半天了都,结果终于被我发现问题的说在了,不过费了这么多事,原来是一个JAVA的一个细节的东西在搞鬼,我是初学JAVA,对JAVA的了解也没有那么深入,所以它的特性也么有掌握好,不过今天被这些细节的东西整惨了。 大家都知道,在C和C++中,数组是不能直接被赋值的,假设有两个数组a[10],
2、b[10],在C和C++中是不能以a=b的方式把b中的内容赋值给相应的数组a的,因为a和b的值其实就是该数组的头指针指向的地址,当然如果很了解数组的实现原理的话,这就很好理解了,在《数据结果》的可能中有涉及到,总之知道数据的数组名就是数组的头指针指向的首个元素的地址,如果能这样理解的话,那么用大腿想一下就知道a=b是不能实现数组的赋值的,一般在C和C++中我们采用了一个循环来单个赋值,类似这样的:1.for(inti=0;i《10;i++)2.a[i]=b[i]; 方式来实现,学了这么久的C和C++,用的多了,
3、也不觉得费事。但是在JAVA中却不想C和C++一样,JAVA很聪明,它可以使用a=b的方式来将b赋值给a,这里的赋值要注意了,在JAVA中使用a=b的时候,在a中以数组的方式来输出内容的时候,跟b的内容一模一样,说明这样的方式可行,我的程序里面就是这样用的,结果整出了BUG来了。一开始发现不管是用a=b还是用a=a.clone();结果都是一样,有些不解,不过现在我完全清楚了。为了说明这个问题,以一段程序演示一下:3.privateint[]subResources(int[]aa,int[]bb)4.{5.//
4、做减法6.int[]a=aa;7.int[]b=bb;8.for(inti=0;i《a.length;i++)9.a[i]=a[i]-b[i];10.returna;11.}这是用来实现两个数组想减的函数,在调用的程序中这样使用12.int[]allo=pcb0.getAllocation().clone();//方式113.14.//int[]allo=pcb0.getAllocation()//方式215.int[]allocation=this.addResources(allo,request); 上面
5、两种方式的参数传入带来的不同结果是,当你在函数addResources修改了传入参数的值的时候,方式1不能改原来的数据,方式2能改变原来的数据。方式1它赋值的时候是先创建一个数组的副本,再把副本来给目标数组赋值,这样副本数组的地址和原来数组的地址当然不是同一个了,这样不管你怎么改,方式1它都不会改变原来的数据,方式2则不一样,方式2它直接将数据的地址赋值给目标数据,这样两个数组不同的数组名,其实指的都是同一个地址,这样当然可以改变原来的值了。 这样分析,它有点像C++中的函数传参中的指针和引用传值一样,由于ja
6、va中都摒弃了指针,所以所有的指向关系都使用了引用类型,用C++用久了就容易犯这样的错误。不像C++中这样传值addResources(int*a,int*b)或者addResources(inta[],intb[])。这会吃亏了,看来这辈子在这个地方就这次了,学东西还得专注一点啊,现在明白了为什么招聘会上的基础题看起来简单,却不是每个人都能答好的。
此文档下载收益归作者所有