`
love~ruby+rails
  • 浏览: 849227 次
  • 性别: Icon_minigender_1
  • 来自: lanzhou
社区版块
存档分类
最新评论

慎用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);

分享到:
评论

相关推荐

    Java语言程序设计:ch04 数组、字符串、向量与哈希表.ppt

    * Java 允许数组的维数为三、四、或更大,但是,慎用高维数组。 * 甚至三维数组在实际的应用中也比较少出现。 七、案例 * 案例:Java 成绩排序和统计。设计程序,能对学生本学期学科(高数、英语、Java、计算机...

    java中慎用继承 以及java中的stack的败笔

    Stack的特点是后进先出(LIFO),而`Vector`底层使用数组实现,并且是线程安全的。由于继承,`Stack`继承了`Vector`的所有方法,包括与栈行为不符的`add(int index, E element)`等,这些方法在实际使用中可能导致...

    请慎用java的File#renameTo(File)方法

    java的file rename方法 以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名、移动文件的目的。不过后来经常发现问题:File#renameTo(File)方法会返回失败(false),文件没有移动,...

    java大作业-聊天室,有待完善,慎用

    JavaFX是Java平台上的一个强大的用户界面工具包,用于创建...但是,由于标题中提到“有待完善,慎用”,说明这个项目可能还在开发阶段,可能存在一些未解决的问题,因此在使用时需要谨慎,可能需要进一步完善和调试。

    加密的惨剧!慎用文件夹加密软件!

    加密的惨剧!慎用文件夹加密软件! 加密的惨剧!慎用文件夹加密软件!

    暴力删除一切顽固文件,慎用!

    把要删除的文件拖到这个文件上面即可。注意,这是强力删除。一定慎用,因为连垃圾箱都会没有的。

    Java数据结构和算法(第二版)

    用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑树 第10章 2-3-4树和外部存储 第11章 哈希表 第12章 堆 第13章 图 第14章 带权图 第15章 应用场合 附录A ...

    易语言处理事件命令慎用时钟版

    易语言处理事件命令慎用时钟版源码,处理事件命令慎用时钟版

    Android高效编程PPT教学课件.pptx

    - 在可能的情况下,使用一维数组替代多维数组,因为多维数组的处理效率较低。例如,使用两个平行的一维数组(Foo[] 和 Bar[])比一个(Foo, Bar)对象数组更高效。 2. **使用原生方法**: - 对象自带的原生方法...

    SQL_MSDE清理小程序(慎用)

    SQL和MSDE清理小程序(慎用),SQL和MSDE清理小程序(慎用),SQL和MSDE清理小程序(慎用),

    01-旋转数组.md

    此外,对于数组这种有序结构,操作`shift`和`unshift`等方法因为它们的时间复杂度是`O(n)`,所以要慎用。 最后,需要强调的是,代码的易读性和易交流性也是非常重要的。在实际开发中,可维护性和团队协作的便利性...

    慎用动态编译

    标题“慎用动态编译”指的是在编程过程中对动态编译这一技术的谨慎态度。动态编译是程序运行时根据需要将源代码编译为可执行代码的过程,与静态编译(编译时一次性完成)形成对比。在Java中,JIT(Just-In-Time)...

    44条Java代码优化建议

    7. 慎用异常 异常处理是Java语言的一个重要特性,但是异常的使用应当慎重。异常的创建和处理会带来额外的性能开销,因为抛出异常时需要创建一个新的异常对象,并在栈上执行跟踪信息的记录。因此,在性能敏感的代码段...

    慎用六大软件伤硬盘最终版.pdf

    慎用六大软件伤硬盘最终版.pdf

    java开发性能优化

    7. **慎用synchronized**:同步可能导致性能下降,应尽量缩小同步代码块的范围。优先使用同步方法而不是同步代码块,以减少锁竞争。 8. **使用StringBuilder和StringBuffer进行字符串拼接**:相较于"+"操作,这两个...

    解决vue无法侦听数组及对象属性的变化问题

    this.$set(array, index, data) - 这是个深度的修改,某些情况下可能导致你不希望的结果,因此最好还是慎用 this.dataArr = this.originArr this.$set(this.dataArr, 0, {data: '修改第一个元素'}) console

    玩客云 灯光控制 容易烧主板 慎用

    玩客云 灯光控制 容易烧主板 慎用

    慎用ext.zip

    标题“慎用ext.zip”可能指的是在编程或系统管理中,对使用特定扩展名如“ext.zip”可能带来的潜在问题的警示。虽然描述部分没有提供具体信息,但我们可以基于这个标题来探讨一下在处理zip文件,特别是那些带有“ext...

Global site tag (gtag.js) - Google Analytics