scala可变集合与不可变集合的理解

先上一个表:

mySet var val
可变对象 add方法
重新赋值 ×
不可变对象 add方法 × ×
重新赋值 ×


对象(实例)可以比作一个人体,而变量就是这个人的名字,例如“张三”。先说下变量与对象的关系:

  1. 名字只是一个人的代号,是可以改的,比如他可以不叫“张三”,而改名叫“狗蛋”。
  2. 但是如果想伤害张三的身体,这个是违法的,或者需要付出代价。
  3. 如果一个人没有了名字,那就是户口被注销了,成了黑户。

var和val的可变与不可变:指的是声明的变量(mySet)是可不可以改变

  1. var:它指向的内存地址(即指针)可以变,但是这里跟上面的比喻有些出入,如果对变量重新赋值,就相当于把这个名字给了别人,原来那个人就没有名字了。一段时间后,就会被当成垃圾回收掉
  2. val:它指向的内存地址(即指针)不可变。即一个人他不可以改名,从生到死都只能用这个名字。

而集合的可变与不可变:指的是对象本身可不可以改变。对象本身是一段内存地址,在scala中我们是不能直接访问的,只能通过mySet这个变量来访问

  1. 可变对象:它有add,move,clear等方法,它的那一段内存地址存储的内容和大小是可以改变的。
  2. 不可变对象:它没有add,move,clear等方法,它的那一段内存地址从声明之后就不能改变。
  3. 如果将var跟不可变对象结合使用,在使用“=”等重新赋值操作时,实际上是重新创建了一个新的对象,原来的对象已经废弃了
var mySet=Set("a","b"); //声明一个可变的mySet变量,可以想象mySet指向的内存地址是A0001
mySet.add("c"); //报错,因为mySet是一个不可变对象,它没有add方法
mySet=Set("a","b","d"); //正常执行,因为用var声明,mySet指针可以改变。这时候mySet指向的内存地址是A0002

val mySet=Set("a","b");//声明一个可变的mySet变量,可以想象mySet指向的内存地址是A0001,且不可改变
mySet.add("c"); //报错,因为mySet是一个不可变对象,它没有add方法
mySet=Set("a","b","d"); //报错,因为使用val声明,mySet指针不能改变


import scala.collection.mutable.Set  //导入可变集合包

var mySet=Set("a","b");
mySet.add("c"); //正常执行,因为mySet是一个可变对象,可以调用它的add方法改变对象
mySet=Set("a","b","d"); //正常执行,因为用var声明,mySet指针可以改变

val mySet=Set("a","b");
mySet.add("c"); //正常执行,因为mySet是一个可变对象,可以调用它的add方法改变对象
mySet=Set("a","b","d"); //报错,因为使用val声明,mySet指针不能改变

猜你喜欢

转载自blog.csdn.net/cakecc2008/article/details/105397231