首先,先寫一個小例子,猜猜下面代碼會如何打印?
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的時候,一定要注意這個問題