Scala中++与++=的区别:a=a++b与a++=b是否等价?
Scala中
++与++=的区别,以及a=a++b和a++=b的含义对比 嗨,我来给你掰扯清楚这两个操作符的差异,结合你给的代码例子会更直观~
核心区别:++ vs ++=
1. ++操作符
++是纯不可变的拼接操作,不管集合是可变还是不可变,它的行为都一致:不会修改原集合,而是返回一个全新的集合,包含原集合和待拼接集合的所有元素。- 比如你代码里的这行:
这里c = c ++ Map(16 -> "hh", 17 -> "℅")c是不可变Map,c ++ ...生成了一个包含原c和新键值对的新Map,然后把这个新Map赋值给变量c——原有的旧Map对象其实还在,只是变量c不再指向它了。
2. ++=操作符
++=的行为会根据集合的可变性而变化:
- 如果是不可变集合(比如你用的
scala.collection.immutable.Map):++=是Scala提供的语法糖,等价于a = a ++ b。因为不可变集合本身不能被修改,所以它本质还是创建新集合,再把新集合赋值给原变量。你代码里的c ++= Map(18 -> "|||")和c = c ++ Map(18 -> "|||")效果完全一样。 - 如果是可变集合(比如
scala.collection.mutable.Map):++=会直接修改原集合对象,把待拼接的元素添加进去,不会创建新的集合对象,这种方式效率更高,因为不需要额外生成新对象。
a=a++b与a++=b是否含义相同?
答案要看a的集合类型:
- 当
a是不可变集合时:两者含义完全相同,a++=b就是编译器自动帮你转换成a = a ++ b,最终都是创建新集合并赋值给a。 - 当
a是可变集合时:两者差异很大:a = a ++ b:会先创建一个包含原a和b所有元素的新集合,然后把变量a指向这个新集合,原来的a对象会被丢弃(等待垃圾回收)。a++=b:直接在原来的a集合对象上添加b的元素,不会生成新对象,操作更高效。
结合你的代码示例验证
你的代码里c是不可变的scala.collection.immutable.Map,所以:
object Dcoder extends App { var c = scala.collection.immutable.Map(12 -> "jd", 13 -> "ff") c = c ++ Map(16 -> "hh", 17 -> "℅") println(c) // 输出包含12、13、16、17的Map c ++= Map(18 -> "|||") println(c) // 输出包含12、13、16、17、18的Map }
这里两行修改c的代码效果完全一致,都是生成新Map并赋值给c,最终输出的c会包含所有新增的键值对。
内容的提问来源于stack exchange,提问作者user9715375
相关产品推荐
相关产品推荐

