看到网上很多讲述java数组克隆的文章,其中给出的例子都不是很完整,有很多不给解释说明,所以经常会让初学者误解。今天闲来无事就写了这么一个程序,请各位参考。
我给出的解释不是很多,但只强调两点:
1. 数组的结构:基本类型数组,仅是一个数组对象;对象类型的数组,是一个数组对象引用一系列对象。
2. 数组对象有 clone 方法,该方法是浅克隆。即:通过该方法返回的对象仅克隆数组对象,如果是对象类型的数组,并不克隆它引用的对象。
虽然下面的程序没有注释,但基于以上两点认识,就可以完整的理解程序。
- package org.joy.usmile;
- public class Main {
- public static void printArray(String head, int[] array) {
- System.out.print(head + " *==>");
- for (int a : array) {
- System.out.print(a);
- System.out.print("\t");
- }
- System.out.println();
- }
- public static <T> void printArray(String head, T[] array) {
- System.out.print(head + " ==>");
- for (T a : array) {
- System.out.print(a);
- System.out.print("\t");
- }
- System.out.println();
- }
- public static void main(String[] args) {
- test1();
- test2();
- test3();
- }
- private static void test1() {
- int[] a = { 1, 2, 3, 4, 5 };
- int[] b = new int[a.length];
- printArray("a : ", a);
- printArray("b : ", b);
- System.out.println();
- b = a.clone();
- printArray("a : ", a);
- printArray("b : ", b);
- System.out.println();
- b[0] = 100;
- printArray("a : ", a);
- printArray("b : ", b);
- System.out.println();
- }
- private static void test2() {
- Integer[] ao = { 1, 2, 3, 4, 5 };
- Integer[] bo = new Integer[ao.length];
- printArray("ao : ", ao);
- printArray("bo : ", bo);
- System.out.println();
- bo = ao.clone();
- printArray("ao : ", ao);
- printArray("bo : ", bo);
- System.out.println();
- bo[0] = 200;
- printArray("ao : ", ao);
- printArray("bo : ", bo);
- System.out.println();
- }
- private static void test3() {
- class Ox {
- public String name;
- public Ox(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[");
- sb.append(this.name);
- sb.append("]");
- return sb.toString();
- }
- }
- Ox[] oa = { new Ox("a"), new Ox("b"), new Ox("c"), new Ox("c"),
- new Ox("d") };
- Ox[] ob = new Ox[oa.length];
- printArray("Ox a", oa);
- printArray("Ox b", ob);
- System.out.println();
- ob = oa.clone();
- printArray("Ox a", oa);
- printArray("Ox b", ob);
- System.out.println();
- ob[0] = new Ox("Love");
- printArray("Ox a", oa);
- printArray("Ox b", ob);
- System.out.println();
- ob[ob.length - 1].name = "[* U Joy *]";
- printArray("Ox a", oa);
- printArray("Ox b", ob);
- System.out.println();
- }
- }
package org.joy.usmile;
public class Main {
public static void printArray(String head, int[] array) {
System.out.print(head + " *==>");
for (int a : array) {
System.out.print(a);
System.out.print("\t");
}
System.out.println();
}
public static <T> void printArray(String head, T[] array) {
System.out.print(head + " ==>");
for (T a : array) {
System.out.print(a);
System.out.print("\t");
}
System.out.println();
}
public static void main(String[] args) {
test1();
test2();
test3();
}
private static void test1() {
int[] a = { 1, 2, 3, 4, 5 };
int[] b = new int[a.length];
printArray("a : ", a);
printArray("b : ", b);
System.out.println();
b = a.clone();
printArray("a : ", a);
printArray("b : ", b);
System.out.println();
b[0] = 100;
printArray("a : ", a);
printArray("b : ", b);
System.out.println();
}
private static void test2() {
Integer[] ao = { 1, 2, 3, 4, 5 };
Integer[] bo = new Integer[ao.length];
printArray("ao : ", ao);
printArray("bo : ", bo);
System.out.println();
bo = ao.clone();
printArray("ao : ", ao);
printArray("bo : ", bo);
System.out.println();
bo[0] = 200;
printArray("ao : ", ao);
printArray("bo : ", bo);
System.out.println();
}
private static void test3() {
class Ox {
public String name;
public Ox(String name) {
this.name = name;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
sb.append(this.name);
sb.append("]");
return sb.toString();
}
}
Ox[] oa = { new Ox("a"), new Ox("b"), new Ox("c"), new Ox("c"),
new Ox("d") };
Ox[] ob = new Ox[oa.length];
printArray("Ox a", oa);
printArray("Ox b", ob);
System.out.println();
ob = oa.clone();
printArray("Ox a", oa);
printArray("Ox b", ob);
System.out.println();
ob[0] = new Ox("Love");
printArray("Ox a", oa);
printArray("Ox b", ob);
System.out.println();
ob[ob.length - 1].name = "[* U Joy *]";
printArray("Ox a", oa);
printArray("Ox b", ob);
System.out.println();
}
}