在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()类似,在例子略作了修改.
相关推荐
### Java数组与字符串用法小结 在Java编程语言中,数组和字符串是两种非常重要的数据类型,它们在处理大量数据或文本时扮演着至关重要的角色。本文将围绕标题“java数组与字符串用法小结”及描述中的知识点进行详细...
Java数组高级算法与Arrays类常见操作小结【排序、查找】 Java数组高级算法与Arrays类常见操作小结是Java数组高级算法的核心内容之一。本文主要介绍了Java数组高级算法与Arrays类常见操作,结合实例形式总结分析了...
首先,Java数组是最基础的数据结构,它提供了固定大小的连续内存空间来存储相同类型的数据。由于其物理结构的特性,数组在随机访问时具有极高的效率,因为可以直接通过索引来访问元素。但是,插入和删除元素时,如果...
在Java编程语言中,数组是一种特殊的数据结构,用于存储同类型的多个数据项。本文将深入探讨Java中数组的创建和参数传递的方法。 首先,我们来看一下如何创建数组。数组的创建分为两个步骤:声明和分配内存空间。...
目录 前言 1、Arrays.copyOf() 2、System.arraycopy() 3、Arrays.copyOfRange() ...在 Java 中实现数组复制有 5 种方法: 【1】Arrays 类的 copyOf() 方法 【2】System 类的 arraycopy() 方法 【3】Arrays类的copyO
- 数组的复制:可以使用 `System.arraycopy()` 方法来复制一个数组的部分或全部到另一个数组。 7. **数组方法** - `Arrays` 类提供了对数组进行排序、比较、填充等操作的方法,如 `Arrays.sort()`、`Arrays....
在Java编程中,删除排序数组中的重复元素是一个常见的问题,特别是在数据处理和算法优化的场景。本篇文章将探讨三种不同的方法来实现这个功能,并对比它们的优劣。 首先,第一种方法是通过`ArrayList`来解决。这种...
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...
- **引用类型**:包括类(Class)、接口(Interface)、数组(Array)等。 #### Java程序结构 - **控制流语句**:如条件判断(`if`, `if-else`, `switch`)、循环(`for`, `while`, `do-while`)等。 - `for`循环...
- 当`Vector`需要扩容时,它会创建一个新的更大数组,并将旧数组的所有元素复制到新数组中。 5. **工具应用** - 在处理线程安全的集合需求时,`Vector`是一个不错的选择,尤其在旧的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...
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 经验之谈-数组...
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.9 本章小结 本章总结了数组的相关知识,包括声明、创建、访问、操作以及使用数组进行成绩统计的方法。 10.10 实训 10:最大最小值与成绩统计 实训旨在实际操作中应用所学知识,找出数组中的最大值、最小值,并...
- **定时器小结**:定时器提供了一种灵活的方式来延迟或周期性地执行任务,但需要注意的是,如果任务执行时间过长,可能会阻塞定时器线程,影响其他任务的执行。 2. **数据结构** - 数据结构是计算机科学中用于...
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 ...
6. CopyOnWriteArrayList/CopyOnWriteArraySet等并发容器:这些容器在写操作时会复制一份新的底层数组,从而避免在并发修改时的数据不一致。 7. 避免共享状态:如果可能,尽量设计无状态的类,这样可以天然避免线程...
实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维...