`
x10232
  • 浏览: 55412 次
  • 来自: 北京
社区版块
存档分类
最新评论

Java对数组的复制

    博客分类:
  • Java
阅读更多
定义一个数组
int[] a={3,1,4,2,5}; 
int[] b=a; 
 
数组b只是对数组a的又一个引用,即浅拷贝。

  如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy
int[] a={3,1,4,2,5};
int[] b=a.clone();
b[0]=10;
System.out.println(b[0]+"  "+a[0]);

但是clone和System.arrayCopy都是对一维数组的深度复制。

对于二维数组则不一样:
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);

输出为10  10所以clone并不能直接作用于二维数组。

  因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。

  要证明,只需看下面的输出
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(a[0]==b[0]);

第5句输出为true.用clone对二维数组进行复制,要在每一维上调用clone函数

int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=new int[a.length][];
for(int i=0;i<a.length;i++)
{ 
b[i]=a[i].clone();
} 
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(b[0]==a[0]);

输出为10  3 false

  小结:

  数组的复制方法现在至少有四个思路:

  1 使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多

  2 使用Object类的clone()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。
protected Object clone() 

  3 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

  4 Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制
static <T> T[] copyOf(T[] original, int newLength)
static <T> T[] copyOfRange(T[] original, int from, int to) 


参考文献http://jingyan.baidu.com/article/e4d08ffddbb7610fd2f60d90.html
分享到:
评论

相关推荐

    Java开发之Java对数组的复制

     作为写的第一篇Java文章,展望一下开始下面的学习;  数组:  1.数组浅拷贝:  1 public static void main(String[] args)  2 {  3 int [] a={1,3,5,7,8,9};  4 int[] b=a; //这里赋值的...

    对数组元素进行选择排序

    项目5、对数组元素进行选择排序1)定义排序方法,在方法中,用for循环嵌套实现排序。第一层循环是从数组的第一个元素开始循环。第二层循环用于与第一层循环中的元素比较找出最值,并将最小值的下标跟第一个元素的...

    java实现基数排序算法

    然后,通过循环迭代从最低位到最高位,依次调用countingSortByDigit()方法对数组进行计数排序。在计数排序中,我们根据当前位上的数字建立计数数组,并计算每个数字出现的次数和累计次数。然后,倒序遍历原始数组,...

    学习Java第八天练习代码Day8.rar

    学习Java第八天的练习代码,包含数组的扩容、数组的复制方法、地址的替换、对数组进行增删改查的汇总代码

    java常用工具类的使用

    该排序算法中只能对整数数组排序,还有其他数据类型呢?就需要重载很多方法进行排序操作。而在Java类库中有一个Arrays类的sort方法已经实现各种数据类型的排序算法。程序员只需要调用该类的方法即可。 代码演示:...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例054 使用sort方法对数组进行排序 67 实例055 反转数组中元素的顺序 68 3.4 常用集合的使用 69 实例056 用动态数组保存学生姓名 69 实例057 用List集合传递学生信息 70 实例058 用TreeSet生成不重复自动排序 随机...

    JavaSE 基础 数组.pdf

    ● 排序数组:使用Arrays.sort()方法对数组进行排序。 ● 搜索数组:使用Arrays.binarySearch()方法在一个已排序的数组中搜索一个元素。 三、数组的五种赋值方法和使用方法 声明数组 int[] arr; //开辟三个空间 ...

    javascript对浅拷贝和深拷贝的详解

    在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。 var arr = [...

    javascript中数组深拷贝途径及对象数组深拷贝

    javascript中数组深拷贝途径及对象数组深拷贝 什么是浅拷贝 ... 然而,正如上面代码所示,一旦对数组a做出修改,实际上会影响拷贝出来的其他数组,这并不是我们所想要的结果,因此就必须用到数组的

    scriptmanager

    -BAM基因组相关 BAM操作: -BAM-BAI索引器 -BAM文件分类器 -BAM删除重复项 -BAM复制合并 -PIP-seq过滤器 BAM格式转换器: -BAM到scIDX -BAM到GFF -BAM到BED -BAM到bedGraph 文件实用程序: -MD5校验和 高峰...

    微软JavaScript手册

    学习JAVA的好帮手,希望有所帮助。欢迎使用 JScript 语言参考 这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要...

Global site tag (gtag.js) - Google Analytics