首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java每日一題】20161219:數組拷貝與引用傳遞陷阱解析

     編輯:Java 綜合教學

【Java每日一題】20161219:數組拷貝與引用傳遞陷阱解析

今天分析一道經典的 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

核心解析

  1. Arrays.copyOf 是淺拷貝:新數組 dogs02 的元素引用指向與 dogs01 相同的 Dog 對象
  2. 修改對象內部狀態影響共享引用:dogs02[1].setColor(Color.white) 修改的是同一個 Dog 實例的顏色
  3. 原數組元素同步變化:遍歷 dogs01 時,第二隻狗顏色已變為 white

記憶圖示

dogs01[0] ──────┐
                ├──► Dog{id=0, color=black}
dogs02[0] ──────┘

dogs01[1] ──────┐
                ├──► Dog{id=1, color=white}  ← 修改後
dogs02[1] ──────┘

避坑指南

  • 需要深拷貝時:手動 new 新對象、使用序列化、或引入工具庫(如 Apache Commons Lang SerializationUtils.clone)
  • 不可變對象天然免疫此類問題,優先設計不可變類
  • 集合拷貝同理:new ArrayList<>(list) 也是淺拷貝

總結

Java 只有值傳遞,對象傳遞的是引用值。淺拷貝複製引用而非對象本身,修改可變對象會影響所有引用。這是面試高頻考點,也是生產 Bug 高發區。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved