鲸落消零派

flutter-Dart中的List的浅拷贝问题

2021-05-16  本文已影响0人  浮华_du

首先,先写一个小例子,猜猜下面代码会如何打印?

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的时候,一定要注意这个问题

https://www.jianshu.com/p/cc75a68f336a

上一篇 下一篇

猜你喜欢

热点阅读