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程序中使用代理呢,有如下两种方式. ...
随机推荐
- VBA Split()函数
Split()函数返回一个数组,其中包含基于分隔符分割的特定数量的值. 语法 Split(expression[,delimiter[,count[,compare]]]) 参数说明 Expressi ...
- 解决 sqlalchemy 报错:(1193, "Unknown system variable 'tx_isolation'")
1出现此报错的原因是使用的mysql8.0 以前用的是:tx_isolation 现在用是: transaction_isolation a.通过升级 sqlalchemy 的方法可以解决此问题, p ...
- bzoj4002 [JLOI2015]有意义的字符串 快速幂
Description B 君有两个好朋友,他们叫宁宁和冉冉. 有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 752844341 ...
- charts 画折线图
主题:指定日期内,不同地区的发布信息的数量的变化曲线 数据库是mongod 数据是58同城的发布的信息 整体思路: 1由于从数据库中拿到的数据,格式等方面并不一样能完全满足需求,需要对数据库中的数据进 ...
- 洛谷 [P4035] 球形空间生成器
高斯消元 注意浮点误差,判断一个浮点数是否为 0 的时候,看他的绝对值与 \(10^{-8}\)的关系 #include <iostream> #include <algorithm ...
- 标准C程序设计七---23
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- koa2 从入门到进阶之路 (一)
首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...
- [Inside HotSpot] Serial垃圾回收器 (二) Minor GC
Serial垃圾回收器Minor GC 1. DefNewGeneration垃圾回收 新生代使用复制算法做垃圾回收,比老年代的标记-压缩简单很多,所有回收代码都位于DefNewGeneration: ...
- noip2013华容道
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
- jfinal使用idea启动 访问报404 action not found
公司一个项目,在eclipse里面启动正常,换到idea里面启动后,启动没有报错,但是访问的时候会提示404 action not found. 百度了很多种解决方法 都没有解决. 今天脑子一转,想到 ...