1.Object.clone()

简单直接,只能对源数组完整地复制

2.Arrays.copyOf(T[] original, int newLength)

可以只复制源数组中部分元素,但复制的起始位置固定为0

3.Arrays.copyOfRange(T[] original, int from, int to)

可以指定复制的起始位置

4.System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

复杂,但可以将源数组中的部分元素复制到目标数组的指定位置(此方法最灵活,可实现上述1、2、3的功能)

1、2、3都具有一定的局限性(返回一个新的数组,无法将源数组中的元素复制到已存在的数组中),

故合并数组的操作只能通过System.arraycopy来完成,以下为示例:

JApp.java

import static java.lang.System.out;
import java.lang.reflect.Array; public class JApp { //没有使用Java中预定义的函数
// private static int[] mergeArrays(int[]... arrays) {
// int lengthOfNewArray = 0;
// for (int i = 0; i < arrays.length; ++i) {
// lengthOfNewArray += arrays[i].length;
// }
// int[] newArray = new int[lengthOfNewArray];
// int index = 0;
// for (int[] array : arrays) {
// for (int i : array) {
// newArray[index++] = i;
// }
// }
// return newArray;
// }
private static <T> T[] mergeArrays(T[]... arrays) {
int lengthOfNewArray = 0;
for (int i = 0; i < arrays.length; ++i) {
lengthOfNewArray += arrays[i].length;
}
//使用(T[])Array.newInstance(...)可避免(T[])new Object[...]引发的ClassCastException
T[] newArray = (T[]) Array.newInstance(arrays[0].getClass().getComponentType(), lengthOfNewArray);
int destPos = 0;
for (int i = 0; i < arrays.length; ++i) {
System.arraycopy(arrays[i], 0, newArray, destPos, arrays[i].length);
destPos += arrays[i].length;
}
return newArray;
} private static int[] mergeArrays(int[]... arrays) {
int lengthOfNewArray = 0;
for (int i = 0; i < arrays.length; ++i) {
lengthOfNewArray += arrays[i].length;
}
int[] newArray = new int[lengthOfNewArray];
int destPos = 0;
for (int i = 0; i < arrays.length; ++i) {
System.arraycopy(arrays[i], 0, newArray, destPos, arrays[i].length);
destPos += arrays[i].length;
}
return newArray;
} public static void main(String[] args) {
int[] ints1 = {0, 1, 2, 3, 4};
int[] ints2 = {5, 6, 7, 8, 9};
int[] ints3 = {10, 11, 12, 13, 14};
int[] buffer = new int[ints1.length + ints2.length + ints3.length];
for (int i : buffer) {
out.print(i + " ");
}
out.println();
System.arraycopy(ints1, 0, buffer, 0, ints1.length);
System.arraycopy(ints2, 0, buffer, ints1.length, ints2.length);
System.arraycopy(ints3, 0, buffer, ints1.length + ints2.length, ints3.length);
for (int i : buffer) {
out.print(i + " ");
}
out.println();
int[] array = mergeArrays(ints1, ints2, ints3);
for (int i : array) {
out.print(i + " ");
}
out.println();
Object[] objects = mergeArrays(new Object[]{"a", "b", "c"}, new Object[]{"D", "E"}, new Object[]{"测试", "Bu Ish", "布衣食"});
for (Object o : objects) {
out.print(o + "、");
}
out.println();
String[] strings = mergeArrays(new String[]{"a", "b", "c"}, new String[]{"D", "E"}, new String[]{"测试", "Bu Ish", "布衣食"});
for (String s : strings) {
out.print(s + "、");
}
out.println();
}
}

Java中数组复制的几种方式以及数组合并的更多相关文章

  1. java中文件复制的4种方式

    今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一 ...

  2. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  3. 数组复制的五种方式(遍历循环一一赋值、System.arraycopy、地址赋值、克隆clone()、Arrays.copyof())

    package com.Summer_0424.cn; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayLis ...

  4. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  5. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...

  6. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

  7. java中遍历集合的三种方式

    第一种遍历集合的方式:将集合变为数组 package com.lw.List; import java.util.ArrayList; import java.util.List; import ja ...

  8. java中使用mongodb的几种方式

    最近有时间看了一下mongodb,因为mongodb更容易扩展所以考虑使用mongodb来保存数据. 首先下载安装mongodb,这是很简单的,装好后使用mongod命令就可以启动数据库.正式部署的话 ...

  9. java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...

随机推荐

  1. (绝对有用)iOS获取UUID,并使用keychain存储

    原文链接 http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html UDID被弃用,使用UUID来作为设备的唯一标识.获取到UUID后,如果用NSUse ...

  2. 【单调队列优化dp】HDU 3401 Trade

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...

  3. request.getContextPath是为了解决相对路径的问题,可返回站点的根路径

    假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下结果 ...

  4. 金鹰dreamweaver视频教程下载地址

    原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] http://download2.gbaopan.com/c188aecb5e524ab2b2a484c061e0 ...

  5. POJ 2096 (dp求期望)

    A - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

  6. 关于gcc内置函数和c隐式函数声明的认识以及一些推测

    最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候,你在代码里面引用了一个函数但是没有包含相关的头文件,这个 ...

  7. Oracle 12c安装报错Installation failed to access the temporary location(无法访问临时位置)

    报错如图 1.先检查当前windows账户用户名是否为全英文,没有就新建一个,大多数用户败在这一步,而官方也没有解释 如何新建:开始-->控制面板-->用户账户和家庭安全-->用户账 ...

  8. 洛谷—— P2656 采蘑菇

    https://www.luogu.org/problem/show?pid=2656 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连 ...

  9. 新闻:融资600万 他用一套系统优化15大HR工作场景 精简入转调离 月开通214家 | IT桔子

    新闻:融资600万 他用一套系统优化15大HR工作场景 精简入转调离 月开通214家 | IT桔子 功劳说不上

  10. 使用java连接AD域,验证账号密码是否正确

    eb项目中有时候客户要求我们使用ad域进行身份确认,不再另外做一套用户管理系统.其实客户就是只要一套账号可以访问所有的OA,CRM等办公系统.这就是第三方验证.一般有AD域,Ldap,Radius,邮 ...