一、分析
在日常工作中,我們會遇見很多數組的拷貝和複制的問題,但是在你使用系統提供的API進行編碼的時候,無形中會留下淺拷貝的隐患。
二、場景
有這樣一個例子,第一個箱子裡面與赤橙黃綠青藍紫7色氣球,現在希望第二個箱子也放入7個氣球,其中最後一個氣球改為藍色,也就是赤橙黃綠青藍藍七個氣球。


第二個箱子的最後一個氣球毫無疑問是被修改了藍色,不過是通過拷貝第一個箱子的氣球實作的,那麼會對第一個箱子的氣球顔色有影響嗎?輸出結果:
Balloon@b2fd8f[編号=0,顔色=Red]
Balloon@a20892[編号=1,顔色=Orange]
Balloon@158b649[編号=2,顔色=Yellow]
Balloon@1037c71[編号=3,顔色=Green]
Balloon@1546e25[編号=4,顔色=Indigo]
Balloon@8a0d5d[編号=5,顔色=Blue]
Balloon@a470b8[編号=6,顔色=Blue]
最後一個氣球竟然被修改了。這是為何?
這是典型的淺拷貝(Shallow Clone)問題,通過copyOf()方法産生的數組是一個淺拷貝引用位址。需要說明的是數組的clone()方法也是與此相同,同樣是淺拷貝,而且集合的clone()方法也是淺拷貝。這就需要大家多留心了。
問題找到了,解決辦法也很簡單,周遊box1的每個元素,重新生成一個氣球(Ballon)對象,并放置到box2數組中。
很多地方使用集合(如List)進行業務處理時,比如發覺需要拷貝集合中的元素,可集合沒有提供任何拷貝方法,是以幹脆使用 List.toArray方法轉換成數組,然後通過Arrays.copyOf拷貝,然後轉換成集合,簡單便捷!但是,非常遺憾,這裡我們有撞到淺拷貝的 槍口上了!!!!
三、建議
雖然很多時候淺拷貝可以解決業務問題,但更多的時候會留下隐患,需要我們提防又提防。
本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/5422216.html,如需轉載請自行聯系原作者