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. 关于JS正则表达式

    去除所有P标签 content=content.replace(/<([\/]?)(p)((:?\s*)(:?[^>]*)(:?\s*))>/g, ''); 将所有的  1.     ...

  2. eclipse中AXIS2发布过程

    Axis2服务端研究好几个小时,终于解决了 需要下载: 地址1: 可以从镜像站下载: 上海大学开源镜像站 地址2: 链接:从百度网盘下载; 密码:8nwu 其中第二个可以不用下: 解压后 将3,4解压 ...

  3. 联合权值(codevs 3728)

    Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...

  4. docker-清理none镜像等操作

    有时候由于调试代码产生很多的none的image,挨个清理会有些麻烦,从网上找到的命令 // 停止所有容器 docker ps -a | grep "Exited" | awk ' ...

  5. android控件-images

    1.imageButton 图片按钮 <ImageButton android:id="@+id/imageButton" android:layout_width=&quo ...

  6. seo优化入门教程:认识搜索引擎

    对于从来没有学过seo或者零基础的人来说,搜索引擎可能都不太了解.所以我们先来认识搜索引擎有哪些,同时为什么我们要学习搜索引擎优化. 从目前全球的一个搜索引擎来说的话,他的分支是非常多的,甚至可以讲, ...

  7. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...

  8. C#总结复习5(需要进一步复习)

    第十五章 接口 1.接口: C++中允许多继承没有接口的概念.而java与C#中有,因为C#中 是单继承多接口. 所谓的接口,其实和抽象类.方法相似.都只有一个空方法.其本身不可以为基类,但是允许被其 ...

  9. HDU 1257 最少拦截系统(dp)

    Problem Description 某国为了防御敌国的导弹突击,发展出一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以到达随意的高度,可是以后每一发炮弹都不能超过前一发的 ...

  10. Serial attached SCSI

    http://en.wikipedia.org/wiki/Serial_attached_SCSI Serial attached SCSI From Wikipedia, the free ency ...