flutter-Dart中的List的淺拷貝問題

首先,先寫一個小例子,猜猜下面代碼會如何打印?

Dart
     List a = ["1","2","3"];
    List b = a;
    print("a=$a");
    print("b=$b");
    b[0] = "0";
    print("a=$a");
    print("b=$b");
    b.removeAt(0);
    print("a=$a");
    print("b=$b");


//I/flutter ( 9805): a=[1, 2, 3]
//I/flutter ( 9805): b=[1, 2, 3]
//I/flutter ( 9805): a=[0, 2, 3]
//I/flutter ( 9805): b=[0, 2, 3]
//I/flutter ( 9805): a=[2, 3]
//I/flutter ( 9805): b=[2, 3]

我們發(fā)現(xiàn),改變b的值,a也會隨之改變;改變a的值,b也會改變。
Dart中的List屬于淺拷貝

Swift
var a = ["1","2","3"]
var b = a
print(a)
print(b)
b[0] = "0"
print(a)
print(b)
b.remove(at: 0)
print(a)
print(b)
a.remove(at: 0)
print(a)
print(b)

//["1", "2", "3"]
//["1", "2", "3"]
//["1", "2", "3"]
//["0", "2", "3"]
//["1", "2", "3"]
//["2", "3"]
//["1", "3"]
//["2", "3"]

Swift中,如果數(shù)組中的元素是整形,字符串,結(jié)構(gòu)體等簡單數(shù)據(jù)類型,那么當(dāng)你將一個數(shù)組賦值給另外的數(shù)組時,數(shù)組中的元素會被拷貝一份,兩個數(shù)組中的元素相互獨立。(深拷貝)

var bean1 = TestBean()
bean1.num = 1
var bean2 = TestBean()
bean2.num = 2
var list1 = [bean1,bean2]
var list2 = list1
list1[0].num = 100
print(list1[0].num)
print(list2[0].num)


class TestBean{
    var num = 0
}


//100
//100

當(dāng)數(shù)組的元素是類的實例時,簡單的將一個數(shù)組賦值給另外的數(shù)組后,由于兩個數(shù)組中元素所引用的對象相同,當(dāng)你改變其中一個數(shù)組中元素的屬性時,另外的數(shù)組中同樣引用的元素對應(yīng)的屬性也會隨之改變。(淺拷貝)。

淺拷貝(shallowCopy)

只是增加了一個指針指向已存在的內(nèi)存地址

深拷貝(deepCopy)

是增加了一個指針并且申請了一個新的內(nèi)存,使這個增加的指針指向這個新的內(nèi)存
所以,當(dāng)我們在Dart中使用List的時候,一定要注意這個問題

http://www.itdecent.cn/p/cc75a68f336a

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容