java.lang.System的静态方法arraycopy()可以实现数组的复制。
java其实没有二维数组的概念,平常实现的二维数组只是元素是一维数组的一维数组,而数组也是引用类型,继承自Object类。数组是new出来的。这些性质也就导致arraycopy()二维数组时出现的问题。如果是复制一个一位数组,那么改变复制后的数组并不影响原数组。但是如果复制一个二维数组,那么改变其中任何一个数组,那么另一个的值也发生了变化。
如果是一维数组,那么元素都是基础类型(如int,double等),使用arraycopy()方法后,是把原数组的值传给了新数组,属于值传递。而如果是二维数组,数组的第一维装的是一个一维数组的引用,第二维里是元素数值。对二维数组应用arraycopy()方法后,第一维的引用被复制给新数组的第一维,也就是两个数组的第一维都指向相同的“那些数组”。而这时改变其中任何一个数组的元素的值,其实都修改了“那些数组”的元素的值,所以原数组和新数组的元素值都一样了。
1. public class
2.
3. /**
4. * @param args
5. */
6. public static void
7. // TODO 自动生成方法存根
8.
9. "中国","山西","太原","TYUT","zyy","加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"};
10. new String[10];
11. 0, s2, 0, 10);
12. 6] = "假设蒙大拿州";
13. 7] = "假设蒙特利尔市";
14. 8] = "假设Montreal商学院";
15.
16. "This is s1");
17. for(int i = 0;i < s1.length ;i++){
18. ",");
19. }
20.
21. "\nThis is s2");
22. for(int i = 0;i < s2.length ;i++){
23. ",");
24. }
25.
26. "中国","山西","太原","TYUT","zyy"},{"加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"}};
27. new String[s3.length][s3[0].length];
28. 0, s4, 0, s3.length);
29.
30. "\nThis is original s3");
31. for(int i = 0;i < s3.length ;i++){
32. for(int j = 0; j< s3[0].length ;j++){
33. ",");
34. }
35. }
36.
37. 1][1] = "假设蒙大拿州";
38. 1][2] = "假设蒙特利尔市";
39. 1][3] = "假设Montreal商学院";
40.
41. "\nThis is s3 after s4 has changed.");
42. for(int i = 0;i < s3.length ;i++){
43. for(int j = 0; j< s3[0].length ;j++){
44. ",");
45. }
46. }
47.
48. "\nThis is s4");
49. for(int i = 0;i < s4.length ;i++){
50. for(int j = 0; j < s4[0].length ; j++){
51. ",");
52. }
53.
54. }
55. }
56.
57. }
结果:
This is s1
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf,
This is s2
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf,
This is original s3
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf,
This is s3 after s4 has changed.
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf,
This is s4
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf,
1. 01.public static void
2. 02. int
3. 03. Object dest,
4. 04. int
5. 05. int
6. 06. 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1
1. public class
2.
3. /**
4. * @param args
5. */
6. public static void
7. // TODO 自动生成方法存根
8.
9. "中国","山西","太原","TYUT","zyy","加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"};
10. new String[10];
11. 0, s2, 0, 10);
12. 6] = "假设蒙大拿州";
13. 7] = "假设蒙特利尔市";
14. 8] = "假设Montreal商学院";
15.
16. "This is s1");
17. for(int i = 0;i < s1.length ;i++){
18. ",");
19. }
20.
21. "\nThis is s2");
22. for(int i = 0;i < s2.length ;i++){
23. ",");
24. }
25.
26. "中国","山西","太原","TYUT","zyy"},{"加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"}};
27. new String[s3.length][s3[0].length];
28. 0, s4, 0, s3.length);
29.
30. "\nThis is original s3");
31. for(int i = 0;i < s3.length ;i++){
32. for(int j = 0; j< s3[0].length ;j++){
33. ",");
34. }
35. }
36.
37. 1][1] = "假设蒙大拿州";
38. 1][2] = "假设蒙特利尔市";
39. 1][3] = "假设Montreal商学院";
40.
41. "\nThis is s3 after s4 has changed.");
42. for(int i = 0;i < s3.length ;i++){
43. for(int j = 0; j< s3[0].length ;j++){
44. ",");
45. }
46. }
47.
48. "\nThis is s4");
49. for(int i = 0;i < s4.length ;i++){
50. for(int j = 0; j < s4[0].length ; j++){
51. ",");
52. }
53.
54. }
55. }
56.
57. }
结果:
This is s1
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf,
This is s2
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf,
This is original s3
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf,
This is s3 after s4 has changed.
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf,
This is s4
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf,