`
XiAoOMAn07
  • 浏览: 75666 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

System.arraycopy

阅读更多
程序如下:
class C{
public static void main(String args[]){
      int a[][] = {{1,2,3},{4,5,6}};
      int b[][] = new int[a.length][a[0].length];
      System.arraycopy(a,0,b,0,a.length); //通过arraycopy()函数拷贝数组
      b[0][0] = 4; //改变数组b[0][0]的值
      System.out.println("a[][]");
       for(int i=0;i<2;i++){
       for(int j=0;j<3;j++){
           System.out.print(a[i][j]+" ");
       }
       System.out.println();
     }
     System.out.println("b[][]");
     for(int i=0;i<2;i++){
     for(int j=0;j<3;j++){
         System.out.print(b[i][j]+" ");
     }
     System.out.println();
    }
}

打印的结果如下:

a[][]
4 2 3
4 5 6
b[][]
4 2 3
4 5 6

而如果把上述程序中的二维数组改为一维数组,结果却不同。程序如下:

class C{
    public static void main(String args[]){
    int a[] = {1,2,3};
    int b[] = new int[a.length];
    System.arraycopy(a,0,b,0,a.length); //通过arraycopy()函数拷贝数组
    b[0] = 4; //改变数组b[0]的值
    System.out.println("a[]:");
    for(int i=0;i<3;i++){
          System.out.print(a[i] + " ");
    }
    System.out.println();
    System.out.println("b[]:");
    for(int i=0;i<3;i++){
           System.out.print(b[i] + " ");
    }
}
}

打印结果如下:

a[]:
1 2 3
b[]:
4 2 3

在第一个程序中,用b[0][0] = 4;只改变了数组b[0][0]的值,可是结果却是数组a[0][0]的值也发生了改变。而在第二个程序中,由于是一个一维数组,改变了b[0]的 值,a[0]的值却并没有受到影响,所以问题可能就出在数组的维数上。第一个程序中的a 是一个数组的数组(java 中没有多维数组的概念,只有数组的数组),同理b 也是,那么a 含有两个元素,第一个是指向(1,2,3) 这个数组的引用,第二个是指向(4,5,6)这个数组的引用,而arrayCopy 就是负责把数组的内容copy 过去的,因此 a 的内容 (2 个引用) 被copy 到b 中去了,因此你对b[0][0] 做修改,a 也会同样跟着变化.
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
JAVA中复制数组元素值的的方法指深拷贝
1 使用for循环,将数组的每个元素复制(需要将每个对象调用clone方法,才能实现真正的复制)
2 使用clone方法,得到数组的值,而不是引用
3 使用System.arraycopy方法

注意:
1.上面方法中arraycopy效率较高。
2. 以上所说的拷贝数组的方法,只是针对一维数组,对于多维数组,要在每一维用以上方法进行复制才能实现复制数组元素的值而不是引用。
3. clone 和 arraycopy对二维数组进行复制时,是浅拷贝, 即

Object[][] aa;
Object[][] bb = aa.clone();
//or bb=System.arraycopy(aa,0,bb, 0, bb.length);
则:
boolean b1 = ( aa[i] == bb[i] ); //false
boolean b2 = (aa[i][j] == bb[i][j]); //true, 可见数组元素只复制了引用。新旧数组指向相同的内存地址,(不论对象数组,还是基本类型数组)。
        /**
        * 数组的浅拷贝是指数组拷贝时,只拷贝了数组的地址,新旧数组指向同一数据
        * 数组的深拷贝,不论数据是基本类型,还是对象类型,都是一样的。
        * 对数组来说,不一样的地方在于,当为数组元素赋值时,基本类型值传递,对象类型是引用传递。
        *
        */
        Object[] a = new Object[]{"String", new Integer(1)};
        Object[] b = a;
       
        /**
        * 数组深拷贝的方法有如下几种:
        * 1。 调用clone
        * 2。 调用System.arraycopy
        * 以上两种对基本类型和对象类型数据效果等同。
        * 3。 使用FOR循环,将数组的每个元素复制。(注意调用clone方法)
        *
        */
       
        /*
        * 当数组数据是基本类型时,
        */
//        int[] array = new int[]{0,1,2,3,4};
//        int[] copy = array.clone();               //1.拷贝数据
//        System.out.println( copy.equals(array));
//        System.out.println( copy == array );
//        for (int i = 0; i < copy.length; i++) {
//            System.out.print( copy[i]+", " );    
//            copy[i]++;                            //2.改变新数组数据内容
//            System.out.print( copy[i]+", " );       
//            System.out.println( array[i]+",");    //3.不影响原始数组
//        }
//        System.out.println();
       
       
        /*
        * 当数组数据是对象类型时,
        */
//        Object[] src = new Object[]{ new String("Zhao"),
//                                         Integer.valueOf(1),
//                                         Integer.valueOf(2),
//                                         Integer.valueOf(3),
//                                         Integer.valueOf(4)};               
//               
//        Object[] dest = src.clone();                //1.拷贝数据
//       
////        Object[] dest = new Object[5];
////        System.arraycopy(src, 0, dest, 0, dest.length);
//       
//        System.out.println( dest.equals(src));
//        System.out.println( dest == src );
//        for (int i = 0; i < dest.length; i++) {
//            System.out.print( dest[i]+", " );    
//            dest[i] = new String("KE");               //2.改变新数组内容                 
//            System.out.print( dest[i]+", " );       
//            System.out.println( src[i]+",");          //3.不影响原始数组
//        }
//        System.out.println();
/**
        * 对多维数组(多维基本类型数组和多维对象数组完全一致。)
        *
        */       
        //多维基本类型数组
        int[][] aa = new int[][]{
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };
       
//        //多维对象类型数组
//        Object[][] aa = new Object[][]{
//                { Integer.valueOf(1),Integer.valueOf(2),Integer.valueOf(3) },
//                { Integer.valueOf(4),Integer.valueOf(5),Integer.valueOf(6) },
//                { Integer.valueOf(7),Integer.valueOf(8),Integer.valueOf(9) }
//        };
       
        /**
        * 一维数组下的深拷贝在 多维数组 只是浅拷贝!!
        */
        int[][] bb = aa.clone();                                 //一维数组下的深拷贝,对于二维数组只是浅拷贝!!
//        int[][] bb = new int[aa.length][aa[0].length];
//        System.arraycopy(aa, 0, bb, 0, aa.length);
       
//        Object[][] bb = aa.clone();
////        Object[][] bb = new Object[3][3];                             
////        System.arraycopy(aa, 0, bb, 0, aa.length);               //一维数组下的深拷贝,对于二维数组只是浅拷贝!!
       
       
        /**
        * 二维数组的深拷贝的实现方式!!! 转为一维数组拷贝。
        */
//        for (int i = 0; i < bb.length; i++) {                    //实现深拷贝的方法!!!!!!!!!!!!
//            System.arraycopy(aa[i], 0, bb[i], 0, aa[i].length);
//           // bb[i] = aa[i].clone();
//        }
       
       
        System.out.println("## 初始 aa:" );                      //1. 初始原数组
        for (int i = 0; i < aa.length; i++) {
            for (int j = 0; j < aa[i].length; j++) {
                System.out.print(aa[i][j]+" ");
            }
            System.out.println( );
        }
       
        System.out.println("## bb = aa.clone() 后bb:" );        //2. 新数组(值等于原数组的值)
        for (int i = 0; i < bb.length; i++) {
            for (int j = 0; j < bb[i].length; j++) {
                System.out.print(bb[i][j]+" ");
            }
            System.out.println( );
        }
       
        System.out.println("## bb改变后:" );                    //3.改变新数组后
        for (int i = 0; i < bb.length; i++) {
            for (int j = 0; j < bb[i].length; j++) {
                bb[i][j] += 10; //for 多维基本类型数组
//                bb[i][j] = new String("Zhao"); //for 多维对象类型数组
                System.out.print(bb[i][j]+" ");
            }
            System.out.println( );
        }
       
        System.out.println("## bb改变后, aa:" );                 //4.输出原数组
        for (int i = 0; i < aa.length; i++) {
            for (int j = 0; j < aa[i].length; j++) {
                System.out.print(aa[i][j]+" ");
            }
        
还有和c++不同,java定义int [][]a=new int[3][];是没有问题的,c和c++后面就是必须要有维数,int a[][3];。

如果list里面全是String[],转为String[][],使用
(String[][]) bodyDataList.toArray(new String[bodyDataList.size()][]);这样就能转成功,还一直不清楚toArray(x)x里面的东西,因为java里面只有array对象
分享到:
评论
4 楼 zhangyan19870108 2013-11-05  
(String[][]) bodyDataList.toArray(new String[bodyDataList.size()][]);这样就能转成功,还一直不清楚toArray(x)x里面的东西,因为java里面只有array对象 

用了范型,需要强制类型转换了吧
3 楼 ih0qtq 2012-07-13  
2 楼 ih0qtq 2012-07-13  
length
1 楼 rongge2 2010-06-01  
arraycopy如果是一维数组,对象类型也是浅拷贝。楼主把数组类型改为StringBuffer看看结果,就会明白了。
       /* 
        * 当数组数据是对象类型时, 
        */ 
//        Object[] src = new Object[]{ new String("Zhao"), 
//                                         Integer.valueOf(1), 
//                                         Integer.valueOf(2), 
//                                         Integer.valueOf(3), 
//                                         Integer.valueOf(4)};                
//                
//        Object[] dest = src.clone();                //1.拷贝数据 
//        
////        Object[] dest = new Object[5]; 
////        System.arraycopy(src, 0, dest, 0, dest.length); 
//        
//        System.out.println( dest.equals(src)); 
//        System.out.println( dest == src ); 
//        for (int i = 0; i < dest.length; i++) { 
//            System.out.print( dest[i]+", " );     
//            dest[i] = new String("KE");               //2.改变新数组内容                  
//            System.out.print( dest[i]+", " );        
//            System.out.println( src[i]+",");          //3.不影响原始数组 
//        } 
//        System.out.println(); 
/** 

相关推荐

    System.arraycopy实现数组之间的复制

    ### System.arraycopy实现数组之间的复制 在Java编程语言中,`System.arraycopy()`是一个非常实用且高效的方法,用于在数组之间复制元素。此方法属于`java.lang.System`类,并且是一个静态方法,这意味着可以直接...

    System.arraycopy和Arrays.copyOf

    `System.arraycopy` 和 `Arrays.copyOf` 都是Java中用于复制数组的方法,但它们在使用和处理异常情况上有所不同。这两个方法在处理数组复制时,提供了便利和效率,但各有其适用场景。 `System.arraycopy` 是一个...

    使用System.arraycopy()实现数组之间的复制

    使用System.arraycopy()实现数组之间的复制

    详解Java合并数组的两种实现方式

    在Java中有多种方式可以实现数组合并,本文将介绍两种常见的实现方式,即使用System.arraycopy()方法和ArrayUtils.addAll()方法。 1. System.arraycopy()方法 System.arraycopy()方法是Java提供的一种本地方法,...

    java三种字符数组合并的方法.doc

    这三种方法分别是:使用循环手动填充新数组、利用`List`集合进行合并再转换为数组以及直接使用`System.arraycopy()`方法。此外,还将涉及如何合并不同类型的数组,如字符数组与整型数组。 ### 方法一:使用循环合并...

    合并两个数组的Java程序.docx

    本篇文章将介绍两种方法来合并两个数组,一种是使用Java内置的`System.arraycopy()`函数,另一种是不使用预定义函数,而是通过手动遍历来实现。 首先,让我们详细讨论使用`System.arraycopy()`的方法。这个方法是从...

    「java三种字符数组合并的方法」.docx

    我们首先创建了一个新的字符串数组 c,然后使用 System.arraycopy 方法将数组 a 和 b 的元素复制到数组 c 中。 代码实现: ```java public static String[] getThreeArray() { String[] a = {"0", "1", "2"}; ...

    2022年计算机二级考试java章节辅导数组元素的复制.docx

    数组元素的复制通常有两种方式:使用循环进行逐个元素的复制,以及使用Java提供的`System.arraycopy()`方法。 首先,我们来探讨一下使用循环复制数组元素的方法。例如,当我们有一个已经初始化的数组`a`,我们想要...

    Java数组倒置源代码

    总结来说,Java数组倒置可以通过多种方式实现,包括使用for循环、`System.arraycopy()`以及Java 8的流API。每种方法有其适用场景和优缺点,开发者应根据实际需求选择合适的方法。在实际开发中,理解并掌握这些基本...

    Java程序优化大全[参照].pdf

    例如,如果你需要复制一个整型数组,避免使用for循环,而是直接调用`System.arraycopy(array1, 0, array2, 0, array1.length)`,这样可以减少不必要的CPU和内存开销。 以上四个优化技巧都是Java开发中常见的性能...

    java中两个byte数组实现合并的示例

    这是通过创建一个新的足够大的字节数组`data3`来实现的,其长度等于`data1`和`data2`的长度之和,然后利用`System.arraycopy()`方法将`data1`和`data2`的内容复制到新数组中。 ```java public static byte[] ...

    Java数组倒置.zip

    总的来说,Java中数组倒置有多种实现方式,包括使用两个指针交换元素、使用`System.arraycopy`复制元素以及对ArrayList使用`Collections.reverse`。理解这些方法可以帮助开发者根据具体需求选择最合适的方式来处理...

    IO流的使用,自己的心得

    System.arraycopy(writeStringToBytes, i*tempLength, temp, 0, writeStringToBytes.length%tempLength); ops.write(new String(temp,"GBK").trim().getBytes(),0,writeStringToBytes.length%tempLength);...

    数组 简单 插入 删除 复制 操作

    例如,`ArrayCopy.java`文件可能有以下代码: ```java public class ArrayCopy { public static void main(String[] args) { int[] original = {1, 2, 3, 4, 5}; int[] copy = new int[original.length]; // ...

    一道面试题的代码:数组合并和排序

    在Java中,可以使用`System.arraycopy()`方法或创建一个新的数组并遍历两个原始数组来完成此操作。假设我们有两个整型数组`int[] array1`和`int[] array2`,我们可以这样做: ```java int[] combinedArray = new ...

    java高端技术课程--Java数组如何实现复制

    Java提供了System类的arraycopy()方法,它是进行数组复制的最直接和高效的方式。该方法接受五个参数:源数组、源数组起始位置、目标数组、目标数组起始位置和复制的元素数量。例如: ```java int[] srcArray = {1...

    Java程序将一个数组的所有元素复制到另一个数组.docx

    Java编程语言中,数组是一种非常基础且重要的...对于大数组或需要复制部分数组的情况,`System.arraycopy()` 和 `Arrays` 类的方法可能更为高效。理解这些复制方法的原理和差异是编写健壮、无副作用的Java代码的关键。

    消费者终端云服务java-A-2021.pdf

    在Java数组复制方法中,效率最高的方法是System.arraycopy。 提到的Java代码中存在空指针异常的情况,但通过测试发现这段代码可以正常运行,因为Java的静态方法可以在类被加载的时候调用,即使它所属的对象是空...

    java培训教程教学课件

    System.arraycopy(ia,0,ib,0,3); // 复制源数组中从下标0开始的3个元素到目的数组,从下标0的位置开始存储。 for(int i=0;i&lt;ia.length;i++) System.out.print(ia[i]); System.out.println(); for(int j=0;...

Global site tag (gtag.js) - Google Analytics