作者TWisely (名)
看板java
標題Re: [蟲?] 靈異現象??=口=""
時間Wed Mar 1 18:22:59 2006
※ 引述《TonyQ (骨頭)》之銘言:
: ※ 引述《TsaiCF (Feng)》之銘言:
: : : 那如果我想要先把陣列A備份為陣列B~
: : System.arraycopy
: copyarray很人性化 可以選擇開始跟結束的index:)
: 不過如果是要直接copy物件的話
: 也是可以採用 clone() 這是不限定在Array能使用的方法
: 只要是物件,就能透過clone()方法和轉型的協助,
: 產生一個同樣內容且非參考同一位址的物件。
: Call By Reference 是個很有趣的現象。:)
: -----------------------------
: ex.
: String a[]={"a","b","c","d","f"};
: String b[]=(String[])a.clone();
: a[0]="g";
: for(String i:b){
: System.out.println(i);
: }
: for(String i:a){
: System.out.println(i);
: }
在各大大後面再補充詳細一點…
由於arraycopy及clone皆為淺層拷貝,
也就是直接拷貝物件欄位內容,而不管該欄位對應的物件個體內容。
故若欄位對應到一陣列,該物件經clone後,
複製的結果也只有對到該陣列的參照,而不會去一個個複製該陣列的元素。
因此原問在提及陣列備份時,
若只是一維陣列,用clone及arraycopy當然沒問題;
但若是一維以上就得對指標層的元素一一去做複製才能做到完整的備份。
(前提為陣列元素是不可變(Immutable)物件,如原問範例中的String;
若為可變物件如List的話,就算是一維也得要一個個元素去做複製才行。)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.104.30.117