谨慎使用java的多维数组

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  前一段时间做的一个项目中,有一处用到了一个多维数组来保护页面的状态。

  这个数组所为一个javaBean对象的属性存在,这个javaBean对象被保存在session中,

  我在修改jsp页面的时候,需要对数组中的一些值做转换。原来代码是这样的:

 String[][]inputData=newString[5][24];   inputData=xxxjavaBean.getSendItem();

  我在后面修改的时候,改变了inputDate的中的值。结果品质部在测试的时候,发现有一个页面的状态到了

  第三个页面去,在返回来的时候就无法记录原来的状态。用debug调试,问题处在保存在session中的javaBean对

  象值被修改了,我找了一个上午都没有找到问题所在,所有可能修改session中值得地方,(.java文件)我都找遍

  了。后来在看jsp页面的时候,发现了这里有个多维数组,才想起来,java中的数组是引用传递。我在jsp页面上修

  改的数据,其实修改的是session中的数据。从而造成了这bug的出现。

  java中的数据对象,在复制数组的是要注意,有多种方法得到Java数组的值拷贝。

  1.可以使用循环,将整个数组的元素值遍历一遍,并指定给另一个数组相对应的索引位置

 int[]arr1={1,2,3,4,5};   int[]arr2=newint[5];   for(inti=0;i<arr1.length;i++){   arr2[i]=arr1[i];   }

  2.使用System类提供的arraycopy()方法

 int[]arr1={1,2,3,4,5};

  3.使用数据的clone()方法

int[]arr1={1,2,3,4,5};   int[]arr2=newint[];   arr2=(int[])arr1.clone();

  对于单维数组这三种方法都是没有问题的,对于多维数组第二第三种方法就会出现问题,

  得到的新数组还是应用传递,而不是值传递,因为java中的克隆是浅层克隆。所以用第二第三种方法的时候,

  也要以单维的形式进行,才能到达值拷贝的结果。

  所以:

  多维情况下:

  1.

int[][]arr1={{1,2,3,4,5},{1,2,3,4,5}};   int[][]arr2=newint[2][5];   for(inti=0;i   System.arraycopy(arr1[i],0,arr2[i],0,arr1[i].length);   }

  2.

   int[][]arr1={{1,2,3,4,5},{1,2,3,4,5}};   int[][]arr2=newint[2][5];   for(inti=0;i   arr2[i]=(int[])arr1[i].clone();   }   int[]arr2=newint[5];   System.arraycopy(arr1,0,arr2,0,arr1.length);

勇士面前无险路。

谨慎使用java的多维数组

相关文章:

你感兴趣的文章:

标签云: