慎用java的多维数组

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

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

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

    String [][] inputData = new String [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 = new int[5];

         for(int i = 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 = new int[];

      arr2 = (int[])arr1.clone();

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

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

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

所以:

多维情况下:

1.

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

        int [][] arr2=new int[2][5];

        for(int i=0;i<arr1.length;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=new int[2][5];

        for(int i=0;i<arr1.length;i++){

            arr2[i]=(int[])arr1[i].clone();

        }

 

     int[] arr2 = new int[5];

     System.arraycopy(arr1, 0, arr2, 0, arr1.length);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值