`

Java数组复制小结

阅读更多

在Java中可以使用Arrays.copyOf()方法和System.arraycopy进行数组复制与扩容,以下是例子:

import java.lang.reflect.Array;
import java.util.Arrays;

public class ArrayCopyTest {

	public static void main(String[] args) {
		// 将源数组复制并且扩容
		String[] arr ={"james", "dajun", "tom", "Lily"};
		arr =Arrays.copyOf(arr, 10);
		System.out.println(Arrays.toString(arr));
		System.out.println("The length of new array is:" + arr.length);
		
		// 将源数组复制到目标数组,并且制定复制的长度
		String[] dest = new String[5];
		System.arraycopy(arr, 0, dest, 0, dest.length);
		System.out.println(Arrays.toString(dest));
		
		// 使用goodArrayCopy复制,并且制定新容量, dest的长度从5扩大到10
		dest = (String[])goodArrayGrow(dest, 10);
		System.out.println(Arrays.toString(dest));
	}
	    // 此处整个数组被当成Object传入,newLength必须大于原先数组长度
	public static Object goodArrayGrow(Object srcArr, int newLength){
		Class arrClass = srcArr.getClass();
		if (!arrClass.isArray())
			return null;
		Class arrType = arrClass.getComponentType();
		int length = Array.getLength(srcArr);
		
		Object newArray = Array.newInstance(arrType, newLength);
		System.arraycopy(srcArr, 0, newArray, 0, length);
		return newArray;		
	}

}

 

程序运行结果如下:

[james, dajun, tom, Lily, null, null, null, null, null, null]
The length of new array is:10
[james, dajun, tom, Lily, null]
[james, dajun, tom, Lily, null, null, null, null, null, null]

  

再看Arrays.copyOf()的源代码,本质上还是调用了System.arraycopy()方法:

/**
     * Copies the specified array, truncating or padding with nulls (if necessary)
     * so the copy has the specified length.  For all indices that are
     * valid in both the original array and the copy, the two arrays will
     * contain identical values.  For any indices that are valid in the
     * copy but not the original, the copy will contain <tt>null</tt>.
     * Such indices will exist if and only if the specified length
     * is greater than that of the original array.
     * The resulting array is of the class <tt>newType</tt>.
     *
     * @param original the array to be copied
     * @param newLength the length of the copy to be returned
     * @param newType the class of the copy to be returned
     * @return a copy of the original array, truncated or padded with nulls
     *     to obtain the specified length
     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
     * @throws NullPointerException if <tt>original</tt> is null
     * @throws ArrayStoreException if an element copied from
     *     <tt>original</tt> is not of a runtime type that can be stored in
     *     an array of class <tt>newType</tt>
     * @since 1.6
     */
    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

 而System.arraycopy是个native方法,不是用Java语言实现的:

 public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

 

此外,在<Java核心技术>第一卷里作者提供了一个通用的goodArrayGrow()方法,此方法的使用与Arrays.copyOf()类似,在例子略作了修改.

 

 

 

6
0
分享到:
评论
2 楼 lijingshou 2013-11-24  
j60017268 写道
基础技术贴,一定要顶。
谢谢,呵
1 楼 j60017268 2013-11-24  
基础技术贴,一定要顶。

相关推荐

    JAVA集合系列(4):关于数组复制的几种方法(源码解读)及执行效率,我们知多少?

    目录 前言 1、Arrays.copyOf() 2、System.arraycopy() 3、Arrays.copyOfRange() ...在 Java 中实现数组复制有 5 种方法: 【1】Arrays 类的 copyOf() 方法 【2】System 类的 arraycopy() 方法 【3】Arrays类的copyO

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 301 11.3.2 公共子表达式消除 / 305 11.3.3 数组边界检查消除 / 307 11.3.4 方法内联 / 307 11.3.5 逃逸分析 / 309 11.4 Java与C/C++的编译器对比 / 311 11.5 本章小结 / 313 第五部分 高效并发 第12章 ...

    21天学通Java-由浅入深

    87 5.3 数组操作的举例 88 5.3.1 数组元素值的复制 88 5.3.2 数组元素的排序 90 5.3.3 在数组里查找指定元素 91 5.3.4 利用数组打印26个英文字母 92 5.4 综合练习 93 5.5 小结 94 5.6 习题 94 第二篇 面向对象篇 第6...

    java基础案例与开发详解案例源码全

    3.7.6 循环语句小结78 3.7.7 break语句79 3.7.8 continue语句82 3.8 JavaDebug技术84 3.9 本章练习85 第4章 4.1 一维数组90 4.1.1 为什么要使用数组90 4.1.2 什么是数组91 4.1.3 如何使用数组92 4.1.4 经验之谈-数组...

    Java虚拟机

    1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行...

    Java开发技术大全 电子版

    1.5本章小结18 第2章Java语言基础19 2.1Java语言的特点19 2.2Java程序的构成21 2.3数据类 型23 2.3.1基本数据类型23 2.3.2常量25 2.3.3变量26 2.3.4整型数据27 .2.3.5浮点型数据29 2.3.6字符型数据30 ...

    java范例开发大全源代码

     实例61 复制数组 85  实例62 插入新元素 86  实例63 数组的合并 87  实例64 去除重复元素 88  实例65 数组求和计算 90  实例66 求最大值、最小值和平均值 91  5.2 二维数组 92  实例67 二维...

    java范例开发大全

    实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵...

    Java范例开发大全 (源程序)

     实例61 复制数组 85  实例62 插入新元素 86  实例63 数组的合并 87  实例64 去除重复元素 88  实例65 数组求和计算 90  实例66 求最大值、最小值和平均值 91  5.2 二维数组 92  实例67 二维数组的...

    Java范例开发大全(全书源程序)

    实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 ...

    java范例开发大全(pdf&源码)

    实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵...

    JAVA程序设计教程

    内容小结.........................................................................................................................12 思考与练习............................................................

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    作为基于分布式文件存储的数据库,在目前的云计算实践中,MongoDB炙手可热。《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。...16.6 本章小结

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    作为基于分布式文件存储的数据库,在目前的云计算实践中,MongoDB炙手可热。《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。...16.6 本章小结

    javaSE代码实例

    5.5.1 数组复制 69 5.5.2 数组排序 71 5.5.3 搜索指定元素 72 5.5.4 比较数组中的元素 73 5.6 关于args[] 73 5.7 小结 74 第二篇 基础篇 第6章 对象和类——Java世界的细胞 77 6.1 面向对象概述 ...

    Python编程入门经典

    1.1.4 小结 4 1.2 准备工作 4 1.2.1 在非Windows系统上安装 Python 3.1 5 1.2.2 使用Python Shell 5 1.3 开始使用Python——字符串 6 1.3.1 字符串概述 6 1.3.2 为什么需要引号 6 1.3.3 为什么有3种类型的引号 7 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 2.2 算法 2.3 伪代码 2.4 控制结构 2.5 if选择结构 2.6 if/e1se选择结构 2.7 while重复结构 2.8 构造算法:实例研究1(计数器控制重复) 2.9 ...

Global site tag (gtag.js) - Google Analytics