List.add(int[])的问题,链表添加数组或对象问题

由于List.add(),追加的数值,则List记录数值, 而如果是对象,则记录地址。对于数组来说,相互传递的地址,那么运行下面的函数会发现,List中add追加的都是同一个地址,并且对应的值都是最后一次更新后的值。

  1. private List<int[]> permutedFpt(int[] v) {   
  2.     List<int[]> VList =new ArrayList<int[]>();   
  3.     VList.add(v);   
  4.     for (int i = 1; i < simHash.blockNum; i++) {   
  5.         int[] tempV = v;   
  6.         int k=this.moveBits*i;   //移动的元素个数   
  7.         tempV = Reverse(tempV, 0this.hashbits-k-1);   
  8.         tempV = Reverse(tempV, this.hashbits-k, this.hashbits-1);   
  9.         tempV = Reverse(tempV, 0this.hashbits-1);   
  10.         VList.add(tempV);   
  11.     }   
  12.     return VList;   
  13. }   
  14.   
  15. private int[] Reverse(int[] v, int b, int e) {   
  16.     for(; b < e; b++, e–)   
  17.     {   
  18.     int temp = v[e];   
  19.     v[e] = v[b];   
  20.     v[b] = temp;   
  21.     }   
  22.     return v;   
  23. }  

对于list.add(a)这个方法执行过程中,传入给add方法参数的到底是什么?到底是a本身,还是a指向的对象。可以这样看这个问题,任何一个变量都有两个属性:地址(在内存中保存数据所用的地址)和值(数据本身的值),通过对变量的使用来访问需要的数据。那么当对一个变量赋值时,到底是把要保存的值绑到变量上了,还是把保存该数据的内存地址绑定到变量上了呢?两种方式都能达到通过变量访问数据的目的,选择方式有由实现者决定。而JVM选择了前者。
在Java中,对于基本数据,实际上是直接把值绑到了变量上,对于对象,实际上是把对象的地址绑定到了变量上。所以,java里面赋值操作都是按值传递的,只不过对于对象而言,传的是对象的地址。
对于List.add值追加不用考虑这个问题,而对于对象追加,为解决这个问题,应该在每次List.add前new()一个新的对象以保证映射的地址不同。要知道Java对象分对象引用和值引用,并且8种基础数据类型,即引用时是值引用的数据类型,比如int,short,long,byte,float,double,char,boolean,其它都是对象引用。并且其它的对象引用不同于c里面的指针传递,这里以后再做讨论。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>