網上常說不建議用 `clone()` 複製陣列,為何?
分析
- 基本型別陣列(`int[]`、`double[]`):`clone()` 產生**新陣列**,元素逐值複製,**完全獨立**,可放心使用。
- 物件參考陣列(`String[]`、`User[]`):`clone()` 只複製**參考**,新舊陣列指向**同一個物件**,修改物件內容會互相影響(**淺拷貝**)。
- `clone()` 回傳 `Object` 需強制轉型,且需實作 `Cloneable` 介面(陣列隱含實作),物件類別若未正確覆寫 `clone()` 易拋 `CloneNotSupportedException`。
推薦替代
- 基本型別:`Arrays.copyOf(arr, arr.length)` 或 `arr.clone()` 皆可。
- 物件陣列需**深拷貝**:逐元素 `new User(u.getName(), u.getAge())`、序列化反序列化、或用 Stream `
Arrays.stream(arr).map(u -> new User(u)).toArray(User[]::new)`。
結論:`clone()` 並非禁用,**理解淺/深拷貝差異**後按需選擇即可。