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. Caffe的Solver参数设置

    Caffe的solver参数设置 http://caffe.berkeleyvision.org/tutorial/solver.html solver是通过协调前向-反向传播的参数更新来控制参数优化 ...

  2. ElasticSearch索引自定义类型

    ES可以自动检测字段并设置映射类型.如果设置的索引类型不是我们所需要的,我们可以自行定义. Rest API设置自定义索引 首先通过ES自动映射一个IP地址的字段的类型: <pre name=& ...

  3. *Codeforces963C. Cutting Rectangle

    $n \leq 200000$种互不相同的矩形,给长宽和数量,都$\leq 1e12$,问有多少种大矩形只沿平行长和宽切正好切成这些矩形. 首先可以发现在一个合法情况下,有些矩形的位置是可以乱挪的,比 ...

  4. Android 网络通信之Socket

    Android 网络通信之Socket 应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然 ...

  5. Croc Champ 2013 - Round 2 C. Cube Problem

    问满足a^3 + b^3 + c^3 + n = (a+b+c)^3 的 (a,b,c)的个数 可化简为 n = 3*(a + b) (a + c) (b + c) 于是 n / 3 = (a + b ...

  6. 【面试 JDK】【第一篇】Object类面试详解

    1.Object类有哪些方法 1>clone()方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异 ...

  7. Activiti Model Editor组件

    通过Activiti Modeler架构图可知,Activiti Explorer采用的是Vaadin框架. Vaadin 是一种 Java Web 应用程序的开发框架, 其设计目标是便利地创建和维护 ...

  8. Go -- 并发编程的两种限速方法

    引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...

  9. Go -- 中开启gctrace

    godebug是一个跨平台的Go程序调试工具,传统的编译型语言调试器使用底层系统调用并读取二进制文件用于调试各类符号.使用起来很麻烦而且很难移植. godebug使用不同的方法,直接把源码作为目标程序 ...

  10. Delphi GDI对象之绘制文本

    转载:http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579185.html 基本绘图操作(Basic Drawing Operations ...