java杂记——数组拷贝

这里介绍两种java提供的数组拷贝方法:

(1)Arrays提供的copyOf(T src, T desLength)和copyOfRange(T src, int from, int to)

(2)System.arraycopy(T src, int from, T des, int from, int length)

使用例子:

(1)

int [] a = {1,2,3,4,5,6};
int [] b = Arrays.copyOf(a, 8); //把a拷贝到长度为8的b中。b的长度可比a长,长的部分补0;可比a短,把a截断。
int [] c = Arrays.copyOfRange(a, 2, 5); //把a的数组下标为2的到下标为5的前一个,拷贝到c中,c的长度为5-2=3。

(2)

int [] a = {1,2,3,4,5,6};
int [] b = new int[8];
System.arraycopy(a, 2, b, 3, 4); //把数组a从下标为2的元素开始,拷贝长度为4的元素到b中,从b的下标为3的位置开始放。
                //如果b的位置不足以放下指定长度的元素,会报java.lang.ArrayIndexOutOfBoundsException异常

在方法(2)中,如果目标数组和源数组相同,则先拷贝到一个temp数组中,再从temp数组中拷回目标数组(源)。

当数组是对象数组的时候,上面的两种方法都不能实现深度拷贝。例如:源代码中的

Lesson9_arrayCopyTest.deepArrayCopy()

详细代码如下:

package javaBase16Lesson;

import java.util.Arrays;

/**
 * (1)
 *     int [] a = {1,2,3,4,5,6};
 *    int [] b = Arrays.copyOf(a, 8);    //把a拷贝到长度为8的b中。b的长度可比a长,长的部分补0;可比a短,把a截断。
 *    int [] c = Arrays.copyOfRange(a, 2, 5);  //把a的数组下标为2的到下标为5的前一个,拷贝到c中,c的长度为5-2=3。
 *
 *(2)
 *    int [] a = {1,2,3,4,5,6};
 *    int [] b = new int[8];
 *    System.arraycopy(a, 2, b, 3, 4);  //把数组a从下标为2的元素开始,拷贝长度为4的元素到b中,从b的下标为3的位置开始放。
 *                                                     //如果b的位置不足以放下指定长度的元素,会报java.lang.ArrayIndexOutOfBoundsException异常
 *
 *(3)
 *方法(1)(2)都只是数组的浅拷贝,无法实现深度拷贝
 * @author cnx
 * @Description : arrayCopyTest
 * @CreateDate ; 2014年7月9日 下午6:43:26
 */
public class Lesson9_arrayCopyTest {
    public static void main(String[] args) {
//        Lesson9_arrayCopyTest.arraysCopyOf();
//        Lesson9_arrayCopyTest.systemArraycopy();
        Lesson9_arrayCopyTest.deepArrayCopy();
    }

    public static void arraysCopyOf(){
        int [] a = {1,2,3,4,5,6};
        int [] b = Arrays.copyOf(a, 8);    //把a拷贝到长度为8的b中。b的长度可比a长,长的部分补0;可比a短,把a截断。
        int [] c = Arrays.copyOfRange(a, 2, 5);  //把a的数组下标为2的到下标为5的前一个,拷贝到c中,c的长度为5-2=3。
        System.out.println("a:"+ a.length);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
        System.out.println("b:"+ b.length);
        for (int i : b) {
            System.out.println(i);
        }
        System.out.println("c:"+ c.length);
        for (int i : c) {
            System.out.println(i);
        }
    }
    /**
     *         Copies an array from the specified source array, beginning at the specified position,
     * to the specified position of the destination array. A subsequence of array components
     * are copied from the source array referenced by src to the destination array referenced by dest.
     * The number of components copied is equal to the length argument. The components at positions
     * srcPos through srcPos+length-1 in the source array are copied into positions destPos through
     * destPos+length-1, respectively, of the destination array.
     *         If the src and dest arguments refer to the same array object, then the copying is performed
     * as if the components at positions srcPos through srcPos+length-1 were first copied to a temporary
     * array with length components and then the contents of the temporary array were copied into
     * positions destPos through destPos+length-1 of the destination array. <br>
     * 如果目标数组和源数组相同,则先拷贝到一个temp数组中,再从temp数组中拷回目标数组(源)
     */
    public static void systemArraycopy(){
        int [] a = {1,2,3,4,5,6};
        int [] b = new int[8];
        System.arraycopy(a, 2, b, 3, 4);  //把数组a从下标为2的元素开始,拷贝长度为4的元素到b中,从b的下标为3的位置开始放。
                                                         //如果b的位置不足以放下指定长度的元素,会报java.lang.ArrayIndexOutOfBoundsException异常
        System.out.println("a:"+ a.length);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
        System.out.println("b:"+ b.length);
        for (int i : b) {
            System.out.println(i);
        }
    }

    /**
     * 上面的两种方法都无法实现深度拷贝
     */
    public static void deepArrayCopy(){
        Lesson9_array1 [] a1 = {new Lesson9_array1(),new Lesson9_array1()};
        Lesson9_array1 [] a2 = null;
        Lesson9_array1 [] a3 = new Lesson9_array1[3];
        Lesson9_array2 [] b1 = {new Lesson9_array2(),new Lesson9_array2()};
        Lesson9_array2 [] b2 = null;

        a2 = Arrays.copyOf(a1, 3);
        System.arraycopy(a1, 0, a3, 0, 2);
        b2 = Arrays.copyOf(b1, 3);

        a1[1].a = "a1";
        System.out.println(a2[1].a);
        System.out.println(a3[1].a);
        b1[1].a = "b1";
        System.out.println(b2[1].a);
    }
}

class Lesson9_array1 implements Cloneable{
    public String a = "deep";

    public Object clone(){
        Object o = null;
        try {
            o = (Lesson9_array1)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }

    public String toString(){
        return a;
    }
}

class Lesson9_array2{
    public String a = "deep";

    public String toString(){
        return a;
    }
}

java杂记——数组拷贝,布布扣,bubuko.com

时间: 2024-09-29 21:54:20

java杂记——数组拷贝的相关文章

Java基础知识强化86:System类之arraycopy()方法(数组拷贝)

1. arraycopy方法(数组拷贝) 1 public static void arraycopy(object src,int srcPos,Object dest,int destPos, int length) 从指定的数组中复制一个数组,复制从指定位置开始,到目标数组的指定位置结束. 参数:        src - 源数组        srcPos - 源数组中的起始位置        dest - 目的数组        destPos - 目标数据中的起始位置        

java数组拷贝的方法

//数组拷贝的方法:System.arraycopy()  /* 查看源代码文件中的System类的arraycopy方法: 这是我的安装目录:D:\OpenSourceSoftware\Java\jdk1.7.0_80\src\java\lang\System.java System.java文件中的arraycopy方法代码如下: public static native void arraycopy(Object src,  int  srcPos,                    

java基础:java环境,第一个Java程序,java的数组

java环境: 1. 什么是字节码和虚拟机? 2. 环境变量的设置 3.一些常用的java命令 4. 计算机如何运行java程序? 5. java的垃圾回收器 6. java的基本数据类型及转换 举例:第一个Java程序 Java的数组: 1. 一维数组 数组的声明 数组分配空间及初始化 数组的长度 两个数组之间的拷贝:System.arraycopy(array1,start,array2,start,length) 2. 二位数组 二维数组的声明及初始化

C++ 的向量结构结合了Java中数组和向量两者的优点

C++ 的向量结构结合了Java中数组和向量两者的优点.一个C++ 的向量可以方便的被访问,其容量又可以动态的增长.如果 T 是任意类型,则 vector<T> 是一个元素为 T 类型的动态数组.下面的语句 vector<int> a; 产生一个初始为空的向量.而语句 vector<int> a(100); 生成一个初始有100个元素的向量.你可以使用push_back 函数来添加元素: a.push_back(n); 调用 a.pop_back() 从a中取出最后一个

将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold", "foreign exchange","fixed income", "futures", "options"}; List<String> assetList = Arrays.asList(asset);

java对数组的操作

1 拷贝数组 数组全拷贝 数组定位拷贝 2 判断数组是否相等(每个元素都对应相等) 3 数组和集合的相互转化 1 import java.util.Arrays; 2 import java.util.List; 3 4 /* 5 1 拷贝数组 6 数组全拷贝 7 数组定位拷贝 8 2 判断数组是否相等(每个元素都对应相等) 9 3 数组和集合的相互转化 10 * */ 11 12 public class Demo2 { 13 public static void main(String[]

7.2-全栈Java笔记:数组常见的操作

数组常见操作 数组的遍历 数组元素下标的合法区间:[0, length-1].我们可以通过下标来遍历数组中的元素,遍历时可以读取元素的值或者修改元素的值. [示例1] 使用循环遍历初始化和读取数组 public class   Test { public static void   main(String[] args) { int[]   a = new int[4]; //初始化数组元素的值 for(int   i=0;i<a.length;i++){ a[i] = 100*i; } //读

[转载自百度文库]数组拷贝(System.arraycopy,深度拷贝)--数组

数组拷贝(System.arraycopy,深度拷贝)--数组 [ITjob课程资料] 拷贝数组 数组一旦创建后,其大小不可调整.然而,你可使用相同的引用变量来引用一个全新的数组: int[] myArray = new int [6]; myArray = new int[10]; 在这种情况下,第一个数组被丢弃,除非对它的其它引用保留在其它地方. Java编程语言在System类中提供了一种特殊方法拷贝数组,该方法被称作arraycopy().例如,araycopy可作如下使用: int[]

Java中数组的概念

1.什么是二维数组?有几种表达方式?分别是什么? 答:多维数组即数组的数组,即数组的元素也是数组. 例:int[] [] a = {{1},{1,2},{1,2,3}}; 有三种方式 1).int [] [] a;  2).int [] a1 [];  3).int a2 [] []; *强烈推荐用第1种,不容易混淆a的数据类型: 2.多维数组的创建过程是什么? 答: 例:int [] [] a = new int [2] []; a[0] = {1,2,3}; a[1] = {4,5,6};