黑马程序员技术交流社区

标题: 数组复制的的几种方法 [打印本页]

作者: 丁桂松    时间: 2012-5-28 15:53
标题: 数组复制的的几种方法
本帖最后由 丁桂松 于 2012-5-28 15:56 编辑
  1. package 复习题;

  2. import java.util.Arrays;
  3. public class 复习题九 {

  4.         /**
  5.          * 数组复制的的几种方法
  6.          */
  7.         public static void main(String[] args) {
  8.                 //声明一个数组
  9.                 int arr[] = { 2113, 234, 4, 5, 1, 3, 1 };
  10.                 //动态复制
  11.                 int arr1[] = new int[arr.length];
  12.                 for (int i = 0; i < arr.length; i++) {
  13.                         arr1[i] = arr[i];
  14.                 }
  15.                 //输出arr1
  16.                 printArray(arr1);
  17.                 //调用Arrays.copyOf();
  18.                 int arr3[] = Arrays.copyOf(arr, arr.length);
  19.                 printArray(arr3);
  20.                 //调用System.arraycopy();
  21.                 int arr4[] = new int[arr.length];
  22.                 System.arraycopy(arr, 0, arr4, 0, arr.length);
  23.                 printArray(arr4);
  24.         }

  25.         static void printArray(int arr[]) { // 输出数组的方法
  26.                 System.out.print("{"); // 首次打印左边中括号
  27.                 for (int i = 0; i < arr.length; i++) { // 遍历数组的角标
  28.                         if (i != arr.length - 1) { // 如果角标不是最后一位角标,就打印元素和逗号
  29.                                 System.out.print(arr[i] + ", ");
  30.                         } else { // 否则(角标是最后一位角标),就打印元素并继续打印右边中括号
  31.                                 System.out.print(arr[i] + "}");
  32.                         }
  33.                         // 把上面的if .. else语句可以改写成下面的三元运算符形式
  34.                         // System.out.print(i==arr.length-1?arr[i]+"}":arr[i]+",");
  35.                 }
  36.         }
  37. }
复制代码
  1. package java基础知识.数组和常用算法;

  2. public class 常用算法_数组复制Test1 {

  3. /**
  4. * @param 通过for循环来完成数组的复制
  5. */
  6. public static void main(String[] args) {
  7. // TODO 声明2个数组 int []a; int [] b;给数组a赋值,b不赋值
  8. int a[] = { 2133, 1194, 411234, 41123, 4112, 341 };// 数组a
  9. int b[] = new int[a.length]; // 数组b,定义长度与a 相等
  10. for (int i = 0; i < a.length; i++) { // 循环遍历数组a的角标
  11. b[i] = a[i]; // 把数组a每个角标对应的元素赋值给数组b对应的角标
  12. }
  13. // 输出数组b被复制以后的结果
  14. for (int i = 0; i < b.length; i++) {
  15. System.out.print(b[i] + "\t");
  16. }
  17. // 变量的赋值和复制
  18. int x = 8;
  19. int y;
  20. y = x;
  21. System.out.println("\n------------------------------------------");
  22. System.out.println(y);
  23. // 数组是否能这么赋值呢?
  24. int m[] = { 2133, 1194, 411234, 41123, 4112, 341 };
  25. int n[];
  26. n = m;
  27. System.out.println("------------------------------------------");
  28. System.out.println(n); // 打印出地址值
  29. System.out.println("------------------------------------------");
  30. // 打印输出n复制以后的
  31. for (int i = 0; i < n.length; i++) {
  32. System.out.print(n[i] + "\t");
  33. }
  34. // 数组的复制
  35. int[] c = { 13, 113, 412, 434, 14 };
  36. int[] d = new int[c.length];// int d [] = new int [5];
  37. System.out.println("\n------------------------------------------");
  38. System.out.print("数组c对应的每个元素输出结果是 :\n");
  39. for (int i = 0; i < c.length; i++) {
  40. System.out.print(c[i] + "\t");
  41. }
  42. System.out.println("\n------------------------------------------");
  43. System.out.println("数组d复制之前的输出结果是 :");
  44. for (int i = 0; i < d.length; i++) {
  45. System.out.print(d[i] + "\t");
  46. }
  47. // 将c数组中的每个元素复制到d数组中对应的每一个元素中
  48. for (int i = 0; i < c.length; i++) {// 复制数组
  49. d[i] = c[i]; // d[0]=c[0];d[1]=c[1];............
  50. }
  51. System.out.println("\n------------------------------------------");
  52. System.out.println("赋值以后的数组d中的元素为 :");
  53. for (int i = 0; i < d.length; i++) {
  54. System.out.print(d[i] + "\t");
  55. }
  56. }
  57. //只有通过循环才能将数组中的每个元素赋值到目标数组中,达到数组复制的目的,目标数组的大小不能小于源数组的大小,否则运行时会出现异常
  58. }
复制代码
  1. package java基础知识.数组和常用算法;

  2. import java.util.Arrays;

  3. public class 常用算法_数组复制Test2 {
  4. /**
  5. * @param 在java中也可以使用System类所提供的arraycopy ()方法来实现数组复制,下面是代码实现; 在jdk
  6. * 6.0以后.也为Arrays类新增了数组复制的copyOf()方法,来实现数组的复制
  7. */
  8. public static void main(String[] args) {
  9. // 使用System类所提供的arraycopy()方法来实现数组的复制
  10. String a[] = { "荷花池边", "荷花飘", "", ",", "公蛤蟆", "搂住", "母蛤蟆腰", "!" };
  11. String b[] = new String[a.length];
  12. System.arraycopy(a, 0, b, 0, a.length);// 这个方式必须明确自行建立一个数组对象
  13. System.out.println("数组b的输出结果是 :");
  14. for (int i = 0; i < b.length; i++) {
  15. System.out.print(b[i]);
  16. }
  17. // 在JDK 6中,Array类别新增了copyOf();方法,可以直接传回一个新的数组对象.而当中包括和复制的内容
  18. String c[] = Arrays.copyOf(a, a.length);
  19. System.out.println("\n数组c的输出结果是 :");
  20. for (int i = 0; i < c.length; i++) {
  21. System.out.print(c[i]);
  22. }
  23. // Arrays的copyOf()方法传回的数组是新的数组对象,所以你改变传回数组中的元素,也不会影响原来的值
  24. // copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值
  25. String d[] = Arrays.copyOf(a, 10);
  26. System.out.println("\n数组d的输出结果是 :");
  27. for (int i = 0; i < d.length; i++) {
  28. System.out.print(d[i]);
  29. }

  30. // System.arraycopy()的使用方法
  31. // System.arraycopy(被复制的数组名,被复制数组的初始角标,要求复制的数组名,要求复制的初始角标,被复制数组的长度)
  32. int arr1[] = { 1, 23, 44, 56, 7 };
  33. // System.arraycopy()方法的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值
  34. int arr2[] = new int[10];
  35. System.arraycopy(arr1, 0, arr2, 2, arr1.length);
  36. System.out.println("\n数组arr2的输出结果是 :");
  37. for (int i = 0; i < arr2.length; i++) {
  38. System.out.print(arr2[i] + "\t");
  39. }
  40. System.out.println("\n数组arr1的被复制以后的输出结果是 :");
  41. for (int i = 0; i < arr1.length; i++) {
  42. System.out.print(arr1[i] + "\t");
  43. }
  44. //Arrays.copyOf();的使用
  45. //新建数组 = Arrays.copyOf(被复制的数组名,数组长度)
  46. int arr3[] = Arrays.copyOf(arr1, arr1.length);
  47. System.out.println("\n数组arr3的被复制以后的输出结果是 :");
  48. for (int i = 0; i < arr3.length; i++) {
  49. System.out.print(arr3[i] + "\t");
  50. }
  51. }
  52. }
复制代码

作者: 黑马罗坚    时间: 2012-5-28 21:29
copyOF 和ArrayCopy 只能复制基本类型 引用类型就死翘翘了。。。  除了String  引用类型复制除了循环 还可以深度克隆。。。谁能介绍下克隆哦。。。。。。  看了API 没看懂。。。
作者: 李平    时间: 2012-5-28 21:48
只知道有这么4种方式。。。。
1 使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多
2 使用Object类的clone() 方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。
3 使用Systems的arraycopy 这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。
4 Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2