首先,先写一个小例子,猜猜下面代码会如何打印?
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]
我们发现,改变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中,如果数组中的元素是整形,字符串,结构体等简单数据类型,那么当你将一个数组赋值给另外的数组时,数组中的元素会被拷贝一份,两个数组中的元素相互独立。(深拷贝)
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
当数组的元素是类的实例时,简单的将一个数组赋值给另外的数组后,由于两个数组中元素所引用的对象相同,当你改变其中一个数组中元素的属性时,另外的数组中同样引用的元素对应的属性也会随之改变。(浅拷贝)。
浅拷贝(shallowCopy)
只是增加了一个指针指向已存在的内存地址
深拷贝(deepCopy)
是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
所以,当我们在Dart中使用List的时候,一定要注意这个问题