今天分析一道經典的 Java 數組拷貝題目,考察 Arrays.copyOf 淺拷貝行為與對象引用特性。
package Dec2016;
import java.util.Arrays;
public class Ques1219 {
public static void main(String[] args) {
int num = 2;
Dog[] dogs01 = new Dog[num];
for (int i = 0; i < num; i++) {
dogs01[i] = new Dog(i, Color.values()[i]);
}
Dog[] dogs02 = Arrays.copyOf(dogs01, dogs01.length);
dogs02[1].setColor(Color.white);
for (Dog dog : dogs01) {
System.out.println(dog);
}
}
}
enum Color { white, black; }
class Dog {
private int id;
private Color color;
public Dog(int id, Color color) { this.id = id; this.color = color; }
public void setColor(Color color) { this.color = color; }
public String toString() { return "編號:" + id + ",顏色:" + color; }
}
編號:0,顏色:black
編號:1,顏色:white
dogs02 的元素引用指向與 dogs01 相同的 Dog 對象dogs02[1].setColor(Color.white) 修改的是同一個 Dog 實例的顏色dogs01 時,第二隻狗顏色已變為 whitedogs01[0] ──────┐
├──► Dog{id=0, color=black}
dogs02[0] ──────┘
dogs01[1] ──────┐
├──► Dog{id=1, color=white} ← 修改後
dogs02[1] ──────┘
SerializationUtils.clone)new ArrayList<>(list) 也是淺拷貝Java 只有值傳遞,對象傳遞的是引用值。淺拷貝複製引用而非對象本身,修改可變對象會影響所有引用。這是面試高頻考點,也是生產 Bug 高發區。