You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:25:51