先上一个表:
mySet | var | val | |
可变对象 | add方法 | √ | √ |
重新赋值 | √ | × | |
不可变对象 | add方法 | × | × |
重新赋值 | √ | × |
对象(实例)可以比作一个人体,而变量就是这个人的名字,例如“张三”。先说下变量与对象的关系:
- 名字只是一个人的代号,是可以改的,比如他可以不叫“张三”,而改名叫“狗蛋”。
- 但是如果想伤害张三的身体,这个是违法的,或者需要付出代价。
- 如果一个人没有了名字,那就是户口被注销了,成了黑户。
var和val的可变与不可变:指的是声明的变量(mySet)是可不可以改变
- var:它指向的内存地址(即指针)可以变,但是这里跟上面的比喻有些出入,如果对变量重新赋值,就相当于把这个名字给了别人,原来那个人就没有名字了。一段时间后,就会被当成垃圾回收掉
- val:它指向的内存地址(即指针)不可变。即一个人他不可以改名,从生到死都只能用这个名字。
而集合的可变与不可变:指的是对象本身可不可以改变。对象本身是一段内存地址,在scala中我们是不能直接访问的,只能通过mySet这个变量来访问
- 可变对象:它有add,move,clear等方法,它的那一段内存地址存储的内容和大小是可以改变的。
- 不可变对象:它没有add,move,clear等方法,它的那一段内存地址从声明之后就不能改变。
- 如果将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指针不能改变