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

先上一个表:

mySetvarval
可变对象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指针不能改变

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值