`

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数组与字符串用法小结

    ### Java数组与字符串用法小结 在Java编程语言中,数组和字符串是两种非常重要的数据类型,它们在处理大量数据或文本时扮演着至关重要的角色。本文将围绕标题“java数组与字符串用法小结”及描述中的知识点进行详细...

    Java数组高级算法与Arrays类常见操作小结【排序、查找】

    Java数组高级算法与Arrays类常见操作小结【排序、查找】 Java数组高级算法与Arrays类常见操作小结是Java数组高级算法的核心内容之一。本文主要介绍了Java数组高级算法与Arrays类常见操作,结合实例形式总结分析了...

    比较Java数组和各种List的性能小结

    首先,Java数组是最基础的数据结构,它提供了固定大小的连续内存空间来存储相同类型的数据。由于其物理结构的特性,数组在随机访问时具有极高的效率,因为可以直接通过索引来访问元素。但是,插入和删除元素时,如果...

    Java中数组的创建与传参方法(学习小结)

    在Java编程语言中,数组是一种特殊的数据结构,用于存储同类型的多个数据项。本文将深入探讨Java中数组的创建和参数传递的方法。 首先,我们来看一下如何创建数组。数组的创建分为两个步骤:声明和分配内存空间。...

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

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

    java中数组的相关知识小结(推荐)

    - 数组的复制:可以使用 `System.arraycopy()` 方法来复制一个数组的部分或全部到另一个数组。 7. **数组方法** - `Arrays` 类提供了对数组进行排序、比较、填充等操作的方法,如 `Arrays.sort()`、`Arrays....

    Java实现删除排序数组中重复元素的方法小结【三种方法比较】

    在Java编程中,删除排序数组中的重复元素是一个常见的问题,特别是在数据处理和算法优化的场景。本篇文章将探讨三种不同的方法来实现这个功能,并对比它们的优劣。 首先,第一种方法是通过`ArrayList`来解决。这种...

    疯狂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个人总结,觉得还不错

    - **引用类型**:包括类(Class)、接口(Interface)、数组(Array)等。 #### Java程序结构 - **控制流语句**:如条件判断(`if`, `if-else`, `switch`)、循环(`for`, `while`, `do-while`)等。 - `for`循环...

    java.util.vector中vector小结

    - 当`Vector`需要扩容时,它会创建一个新的更大数组,并将旧数组的所有元素复制到新数组中。 5. **工具应用** - 在处理线程安全的集合需求时,`Vector`是一个不错的选择,尤其在旧的Java代码库中。然而,现代的多...

    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 运行...

    第10章成绩统计——数组与字符串.ppt

    10.9 本章小结 本章总结了数组的相关知识,包括声明、创建、访问、操作以及使用数组进行成绩统计的方法。 10.10 实训 10:最大最小值与成绩统计 实训旨在实际操作中应用所学知识,找出数组中的最大值、最小值,并...

    day009 java基础进阶-定时器,数据结构.doc

    - **定时器小结**:定时器提供了一种灵活的方式来延迟或周期性地执行任务,但需要注意的是,如果任务执行时间过长,可能会阻塞定时器线程,影响其他任务的执行。 2. **数据结构** - 数据结构是计算机科学中用于...

    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线程安全问题小结_动力节点Java学院整理

    6. CopyOnWriteArrayList/CopyOnWriteArraySet等并发容器:这些容器在写操作时会复制一份新的底层数组,从而避免在并发修改时的数据不一致。 7. 避免共享状态:如果可能,尽量设计无状态的类,这样可以天然避免线程...

    java范例开发大全源代码

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

Global site tag (gtag.js) - Google Analytics