`
XiAoOMAn07
  • 浏览: 74760 次
  • 性别: 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(),我们可以使用它来实现数组之间的复制。

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

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

    System.arraycopy和Arrays.copyOf

    个人研究所得,包含对其内部jdk源码的分析。 同时会结合ArrayList中对该两个方法的调用做进一步说明。...总结一句话:在允许的情况下,尽量调用System.arraycopy方法,实在不行再调用Arrays.copyOf方法。

    IO流的使用,自己的心得

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

    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;...

    记事本代码

    /** * 动态调整数组的长度 */ public class AdjustArrayLength { private static int DEFAULT_LENGTH = 10; public static Integer... System.arraycopy(src, 0, result, 0, src.length); return result; }

    EmvReader Java Code

    System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length); currentIndex += arrays[i].length; } return result; } public static byte[] getCurrentDateAsByteArray( String sFormat ) { ...

    JAVA——linux

    System.arraycopy(num, 0, ch, ch.length-num.length, num.length); String ball = new String(ch); red[i] = ball; } String[] blue = ("01,02,03,04,05,06,07," + "08,09,10,11,12,13,14,15,16").split(",...

    Java开发常用的方法

    数组拷贝,建议使用System.arraycopy()速度更快,把source数据内容拷贝到destination中使用Object则支持多种对象数组;去除数组中的重复元素;四舍五入;判断字符串是否是小数;半角数字的unicode范围;取得ascii码;

    JavaSE 基础 数组.pdf

    ● 复制数组:使用System.arraycopy()方法或Arrays.copyOf()方法将一个数组复制到另一个数组中。 ● 排序数组:使用Arrays.sort()方法对数组进行排序。 ● 搜索数组:使用Arrays.binarySearch()方法在一个已排序的...

    数组的深拷贝与浅拷贝以及数组拷贝的几种方式比较

    目录一、深拷贝与浅拷贝解析浅拷贝深拷贝二、数组拷贝的方式1.for循环来拷贝2.System.arraycopy( )拷贝3.Arrays.copyOf( )拷贝4.clone( )拷贝5.解释三、四种拷贝方式效率比较1. System.arraycopy( )2.Arrays.copyOf...

    java程序设计实验代码

    编写一个类MyArray,包含一个复制数组的方法,功能与System.arraycopy()相同。请使用泛型改写MyArray类实现数组复制. 请编写程序。首先在程序中定义一个枚举类型,它含有7个枚举常量,分别表示一个星期每一天的名称...

    90行Java代码实现最简洁小巧俄罗斯方块~~全球最小实现:)

    90行Java代码实现小巧俄罗斯方块~~ 66行改为: System.arraycopy(matrix[j-1],0,matrix[j],0,10); 修改的一个Bug 最新版本在:http://wireless.javaeye.com/blog/595321

    【05-面向对象(下)】

    基本数据类型的包装类 •八大数据类型的包装类分别为:Byte、Short、Integer、Long、Character、 Float、Double、Boolean。 把基本数据类型变量包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个...

    java学习笔记 - 6

    数组的复制:System.arraycopy(src, srcPos, dest, destPos, length); Arrays.copyOf(original, newLength); 数组的排序:排序方法和排序分类 Arrays.sort(arr);//对arr进行升序排列 2.方法(函数、过程): ...

    Java网络编程-Socket-文件传输小案例

    System.arraycopy(blockdb, 0, tmpdb, 0, BlockSize);// raf.seek( (util.getBlockSize() + 4) * BlockIndex); //(+4)是用于存放文件大小信息的 //文件块写入临时文件中将相应数据块放到相应的位置中去 raf....

    java数组扩容2

    Java数组扩容的原理  1)Java数组对象的大小是固定... 3)System.arraycopy()可以复制数组。  4)Arrays.copyOf()可以简便的创建数组副本。  5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容。

    Java基础之数组拷贝

    System.arraycopy方法4. Arrays.copyOfRange方法 1. 直接赋值 在java中,我们可以将一个数组变量直接拷贝给另一个数组变量。但拷贝后,两个数组变量引用的是同一个数组。若改变其中一个数组中的内容,另一个数组也...

    Java System类的使用

    import java .util.*; public class SystemTest { public static void ... System.out.println(System.arraycopy); int[] dst = new int[src.length]; System.arraycopy(src, 0, dst

    实现数组复制常用的5种方式及组合类的深复制(深拷贝)

    b) System.arraycopy()方法 c) Arrays.copyOf()方法 d) 使用clone()方法 e) Arrays.copyOfRange()方法 接下来,我们看下这几种方法的效率和源码,以及如何使用序列化和反序列化实现组合类的深复制。 我们以百万级和...

Global site tag (gtag.js) - Google Analytics