可变对象,不可变对象

Posted cdcc1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可变对象,不可变对象相关的知识,希望对你有一定的参考价值。

不可变对象为字符串,元组等

可变对象为列表,字典,集合等。

浅拷贝只是对已经存在的内存新增加一个对象引用。,

深拷贝就是重新申请一个新的内存,使这个是新对象是新内存地址的引用。

对于可变对象引用时时经常出现。

考虑以下两段代码:

代码1

l = []
for i in range(10):
    l.append({num:i})
print(l)

结果:
[{num: 0}, {num: 1}, {num: 2}, {num: 3}, {num: 4}, {num: 5}, {num: 6}, {num: 7}, {num: 8}, {num: 9}]

代码2

l = []
a = {num:0}
for i in range(10):
    a[num] = i
    l.append(a)
print(l)
print(id(l[0]) : ,id(l[0]),
id(l[1]) : ,id(l[1]))

结果:
[{num: 9}, {num: 9}, {num: 9}, {num: 9}, {num: 9}, {num: 9}, {num: 9}, {num: 9}, {num: 9}, {num: 9}]
id(l[0]) :  4542112 
id(l[1]) :  4542112

结论:

  代码1中l.append中新添加的对象为新创建的对象,

  代码2中l.append中新添加的对象为字典a,即 l[new] = a,  l[new] 为a所指向内存地址的一个新引用,所有的  l[new] 都指向同一个内存地址。而字典a为可变对象,后面a的发生改变时,即所在内存地址内数据发生改变。,

以上是关于可变对象,不可变对象的主要内容,如果未能解决你的问题,请参考以下文章

合理利用Java不可变对象,让你的代码更加优雅

java-并发-不可变对象

java中是啥是不可变对象和可变对象

可变对象和不可变对象

发送到不可变对象的变异方法

可变于不可变对象分类