Java中数组复制的几种方式以及数组合并
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中数组复制的几种方式以及数组合并的更多相关文章
- java中文件复制的4种方式
今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一 ...
- java中数组复制的两种方式
在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...
- 数组复制的五种方式(遍历循环一一赋值、System.arraycopy、地址赋值、克隆clone()、Arrays.copyof())
package com.Summer_0424.cn; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayLis ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...
- Java实现文件复制的四种方式
背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...
- java中遍历集合的三种方式
第一种遍历集合的方式:将集合变为数组 package com.lw.List; import java.util.ArrayList; import java.util.List; import ja ...
- java中使用mongodb的几种方式
最近有时间看了一下mongodb,因为mongodb更容易扩展所以考虑使用mongodb来保存数据. 首先下载安装mongodb,这是很简单的,装好后使用mongod命令就可以启动数据库.正式部署的话 ...
- java中设置代理的两种方式
1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...
随机推荐
- 关于JS正则表达式
去除所有P标签 content=content.replace(/<([\/]?)(p)((:?\s*)(:?[^>]*)(:?\s*))>/g, ''); 将所有的 1. ...
- eclipse中AXIS2发布过程
Axis2服务端研究好几个小时,终于解决了 需要下载: 地址1: 可以从镜像站下载: 上海大学开源镜像站 地址2: 链接:从百度网盘下载; 密码:8nwu 其中第二个可以不用下: 解压后 将3,4解压 ...
- 联合权值(codevs 3728)
Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...
- docker-清理none镜像等操作
有时候由于调试代码产生很多的none的image,挨个清理会有些麻烦,从网上找到的命令 // 停止所有容器 docker ps -a | grep "Exited" | awk ' ...
- android控件-images
1.imageButton 图片按钮 <ImageButton android:id="@+id/imageButton" android:layout_width=&quo ...
- seo优化入门教程:认识搜索引擎
对于从来没有学过seo或者零基础的人来说,搜索引擎可能都不太了解.所以我们先来认识搜索引擎有哪些,同时为什么我们要学习搜索引擎优化. 从目前全球的一个搜索引擎来说的话,他的分支是非常多的,甚至可以讲, ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...
- C#总结复习5(需要进一步复习)
第十五章 接口 1.接口: C++中允许多继承没有接口的概念.而java与C#中有,因为C#中 是单继承多接口. 所谓的接口,其实和抽象类.方法相似.都只有一个空方法.其本身不可以为基类,但是允许被其 ...
- HDU 1257 最少拦截系统(dp)
Problem Description 某国为了防御敌国的导弹突击,发展出一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以到达随意的高度,可是以后每一发炮弹都不能超过前一发的 ...
- Serial attached SCSI
http://en.wikipedia.org/wiki/Serial_attached_SCSI Serial attached SCSI From Wikipedia, the free ency ...