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

  1. import static java.lang.System.out;
  2. import java.lang.reflect.Array;
  3.  
  4. public class JApp {
  5.  
  6. //没有使用Java中预定义的函数
  7. // private static int[] mergeArrays(int[]... arrays) {
  8. // int lengthOfNewArray = 0;
  9. // for (int i = 0; i < arrays.length; ++i) {
  10. // lengthOfNewArray += arrays[i].length;
  11. // }
  12. // int[] newArray = new int[lengthOfNewArray];
  13. // int index = 0;
  14. // for (int[] array : arrays) {
  15. // for (int i : array) {
  16. // newArray[index++] = i;
  17. // }
  18. // }
  19. // return newArray;
  20. // }
  21. private static <T> T[] mergeArrays(T[]... arrays) {
  22. int lengthOfNewArray = 0;
  23. for (int i = 0; i < arrays.length; ++i) {
  24. lengthOfNewArray += arrays[i].length;
  25. }
  26. //使用(T[])Array.newInstance(...)可避免(T[])new Object[...]引发的ClassCastException
  27. T[] newArray = (T[]) Array.newInstance(arrays[0].getClass().getComponentType(), lengthOfNewArray);
  28. int destPos = 0;
  29. for (int i = 0; i < arrays.length; ++i) {
  30. System.arraycopy(arrays[i], 0, newArray, destPos, arrays[i].length);
  31. destPos += arrays[i].length;
  32. }
  33. return newArray;
  34. }
  35.  
  36. private static int[] mergeArrays(int[]... arrays) {
  37. int lengthOfNewArray = 0;
  38. for (int i = 0; i < arrays.length; ++i) {
  39. lengthOfNewArray += arrays[i].length;
  40. }
  41. int[] newArray = new int[lengthOfNewArray];
  42. int destPos = 0;
  43. for (int i = 0; i < arrays.length; ++i) {
  44. System.arraycopy(arrays[i], 0, newArray, destPos, arrays[i].length);
  45. destPos += arrays[i].length;
  46. }
  47. return newArray;
  48. }
  49.  
  50. public static void main(String[] args) {
  51. int[] ints1 = {0, 1, 2, 3, 4};
  52. int[] ints2 = {5, 6, 7, 8, 9};
  53. int[] ints3 = {10, 11, 12, 13, 14};
  54. int[] buffer = new int[ints1.length + ints2.length + ints3.length];
  55. for (int i : buffer) {
  56. out.print(i + " ");
  57. }
  58. out.println();
  59. System.arraycopy(ints1, 0, buffer, 0, ints1.length);
  60. System.arraycopy(ints2, 0, buffer, ints1.length, ints2.length);
  61. System.arraycopy(ints3, 0, buffer, ints1.length + ints2.length, ints3.length);
  62. for (int i : buffer) {
  63. out.print(i + " ");
  64. }
  65. out.println();
  66. int[] array = mergeArrays(ints1, ints2, ints3);
  67. for (int i : array) {
  68. out.print(i + " ");
  69. }
  70. out.println();
  71. Object[] objects = mergeArrays(new Object[]{"a", "b", "c"}, new Object[]{"D", "E"}, new Object[]{"测试", "Bu Ish", "布衣食"});
  72. for (Object o : objects) {
  73. out.print(o + "、");
  74. }
  75. out.println();
  76. String[] strings = mergeArrays(new String[]{"a", "b", "c"}, new String[]{"D", "E"}, new String[]{"测试", "Bu Ish", "布衣食"});
  77. for (String s : strings) {
  78. out.print(s + "、");
  79. }
  80. out.println();
  81. }
  82. }

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. VBA Split()函数

    Split()函数返回一个数组,其中包含基于分隔符分割的特定数量的值. 语法 Split(expression[,delimiter[,count[,compare]]]) 参数说明 Expressi ...

  2. 解决 sqlalchemy 报错:(1193, "Unknown system variable 'tx_isolation'")

    1出现此报错的原因是使用的mysql8.0 以前用的是:tx_isolation 现在用是: transaction_isolation a.通过升级 sqlalchemy 的方法可以解决此问题, p ...

  3. bzoj4002 [JLOI2015]有意义的字符串 快速幂

    Description B 君有两个好朋友,他们叫宁宁和冉冉. 有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 752844341 ...

  4. charts 画折线图

    主题:指定日期内,不同地区的发布信息的数量的变化曲线 数据库是mongod 数据是58同城的发布的信息 整体思路: 1由于从数据库中拿到的数据,格式等方面并不一样能完全满足需求,需要对数据库中的数据进 ...

  5. 洛谷 [P4035] 球形空间生成器

    高斯消元 注意浮点误差,判断一个浮点数是否为 0 的时候,看他的绝对值与 \(10^{-8}\)的关系 #include <iostream> #include <algorithm ...

  6. 标准C程序设计七---23

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  7. koa2 从入门到进阶之路 (一)

    首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...

  8. [Inside HotSpot] Serial垃圾回收器 (二) Minor GC

    Serial垃圾回收器Minor GC 1. DefNewGeneration垃圾回收 新生代使用复制算法做垃圾回收,比老年代的标记-压缩简单很多,所有回收代码都位于DefNewGeneration: ...

  9. noip2013华容道

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  10. jfinal使用idea启动 访问报404 action not found

    公司一个项目,在eclipse里面启动正常,换到idea里面启动后,启动没有报错,但是访问的时候会提示404 action not found. 百度了很多种解决方法 都没有解决. 今天脑子一转,想到 ...