Scala不可变Map拼接操作的新对象创建问题咨询
关于Scala不可变Map拼接操作的对象创建问题
让我们结合Scala不可变集合的核心特性,逐个解答你的问题:
a) 是否因++操作导致新对象被创建?
是的,完全正确。Scala中不可变集合的所有"修改类"操作(包括++这种拼接操作)都不会改变原集合实例,而是会返回一个全新的集合对象。
看你给出的代码:
var map=Map("abc"-> 1,"xyz"->2) var change =map++Map("change of object"->3)
这里的map指向的是一个不可变Map实例,当你调用map++...时,Scala会创建一个包含原map所有键值对,再加上新传入的"change of object"->3的新不可变Map实例,然后把这个新实例的引用赋值给change变量。原map指向的那个包含两个键值对的实例完全没有被修改,依然存在于内存中。
b) 是否因使用不可变集合且长度变化,从而创建了新对象?
没错,这正是不可变集合的核心行为。Scala的不可变集合设计初衷就是:一旦创建,其内部状态(包括元素数量、元素值)就不可更改。任何会改变集合结构(比如长度增加/减少、元素替换)的操作,都必须通过创建新的集合实例来完成,原实例保持不变。
在你的例子里,原map的长度是2,拼接后新集合的长度是3,属于集合结构的变化,所以必然会生成新的对象。哪怕你用的是var声明变量(变量本身可以指向不同的实例),但不可变集合的实例本身是无法被修改的,结构变化只能通过新对象来实现。
内容的提问来源于stack exchange,提问作者user9715375
相关产品推荐
相关产品推荐

