Scala 中的可变(var)与不可变(val)
引言
Scala 中定义变量分为 var(可变变量)和 val(不可变变量)
Scala 中集合框架也分为可变集合和不可变集合。比如 List(列表) 和 Tuple(元组)本身就是不可变的,set 和 map 分为可变和不可变的,默认为不可变。
var 与 val 的理解
例子如下:
var list = List(“Hello”,“World”);
list += “Scala”;
很多童靴看到以上这段代码,可能比较费解。var 定义的变量是可变的,List 集合本身又是不可变的,怎么能一起使用呢?而且 List 为啥还能添加元素呢?
首先,我们来理解 List 为不可变的为何还能添加元素
原本的 List 是不可变的,这并没有错,但在执行添加 “Scala” 元素时,其实并不是在原本的 List 对象中添加,而是新建一个 List 包含了 Hello,World,Scala。这就好比 Java
中的 String 类型是固定长度的,每次向 String 对象追加字符串都会创建一个新的 String 对象。
接着,我们来理解 var 是可变的,List 不可变,为何能一起使用?
这当然没有问题,我们定义变量所使用的是 var 和 val 是对象的地址引用,并不是对象本身,和对象可不可变并没有任何关系。
var list 表示变量 list 指向的对象是 List(“Hello”,“World”),而我们可以修改变量 list 指向的对象。在执行添加 “Scala” 元素时会创建一个新 List 对象,这是 list 变量就指向这个新对象。
想一想,如果我们定义把 var list 换成 val list 还能执行 "list += “Scala” 添加元素吗?
答案是不行哈,这时 list 是常量,是不允许修改的,所以不允许再指向新 List 对象。
同理,Set 和 Map也是一样。
总结
- var 表示定义一个变量,变量所指向的对象是允许修改
- val 表示定义一个常量,常量所指向的对象不允许修改
- List、Tuple、Set 和 Map 都是不可变的,与 Java 的 String 类似,添加元素等操作会创建新的对象
Scala 中的可变(var)与不可变(val)的更多相关文章
- scala可变var与不可变val的理解
我们定义变量的时候分为var可变变量和val不可变变量. 我们使用容器的时候也分为可变容器和不可变容器. List和Tuple本身就是不可变的,set和map分为可变和不可变的,默认为不可变. 我们看 ...
- Scala中的类和对象
类的定义 使用class定义 类的字段 在类中使用var,val定义字段 类的方法 scala中,使用var定义字段默认提供setter和getter方法对应名称为 value_= 和value /* ...
- Programming In Scala笔记-第七章、Scala中的控制结构
所谓的内建控制结构是指编程语言中可以使用的一些代码控制语法,如Scala中的if, while, for, try, match, 以及函数调用等.需要注意的是,Scala几乎所有的内建控制结构都会返 ...
- scala (4) 可变数组和不可变数组
在scala中数组分为不可变长数组(在immutable包下)和可变长数组(在mutable包下) 不可变长数组指的是长度不可变,但是数组中角标对应的元素的值是可变的 可变数组指的是长度和数组中角标对 ...
- scala中的val,var和lazy
转自:https://yerias.github.io/2020/03/19/scala/3/#3%EF%BC%9Alazy%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%8F%AF%E ...
- scala中val和var的区别
1:内容是否可变:val修饰的是不可变的,var修饰是可变的 2:val修饰的变量在编译后类似于java中的中的变量被final修饰 3:lazy修饰符可以修饰变量,但是这个变量必须是val修饰的 p ...
- Java中的String为什么是不可变的?
转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那 ...
- Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
1. 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...
- Python中的可变对象和不可变对象
Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...
随机推荐
- 软件工程第一次作业:Warm Up
Warm Up 项目 内容 作业所属课程 2021春季软件工程(罗杰 任健) 作业要求 第一次阅读作业 课程目标 培养通过团队协作使用软件开发工具按照软件工程方法开发高质量并且可用的复杂软件系统的能力 ...
- .NET管道应用——工作池
名词解释 工作池:一组等待任务分配的线程.一旦完成了所分配的任务,这些线程可继续等待任务的分配. .NET管道:命名空间System.Threading.Channels中的Channel和Chann ...
- dubbo的spi思想是什么?
spi,简单来说,就是service provider interface,说白了是什么意思呢,比如你有个接口,现在这个接口有3个实现类,那么在系统运行的时候对这个接口到底选择哪个实现类呢?这就需要s ...
- 对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载
目录 一.MinIO快速入门 1. MinIO简介 2. CentOS7更换成阿里云镜像 3. 安装 3.1 下载 3.2 运行测试 4. 配置脚本执行文件 4.1 创建配置执行文件 4.2 执行 二 ...
- JMeter 实战案例
案例1:博客网站后端测试 案例2:JPetStore 应用 案例1:博客网站后端测试 测试目标 测试博客网站后端的常用 HTTP 接口的访问方法. 展示 HTTP 请求的各类使用方法. 展示提取 JS ...
- kubespray续签k8s证书
查看证书过期时期 [root@node1 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not ...
- 进击中的Vue 3——“电动车电池范围计算器”开源项目
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/build-a-tesla-battery- ...
- liunx从0开始部署vue+spring boot项目(包含:安装jdk、mysql、nginx)
单纯记录,若有不合理不规范的地方请忽略. 0.配置JDK 0.下载liunx的jdk解压到/usr/local目录下. tar -xzvf jdk-8u291-linux-x64.tar.gz -C ...
- thinkphp5的extend怎么用?
http://www.newthink.cc/2017/09/13/thinkphp5%E7%9A%84extend%E6%80%8E%E4%B9%88%E7%94%A8%EF%BC%9F/#i-2
- SVCHOST启动服务实战
本文转载自:https://blog.csdn.net/huanglong8/article/details/70666987 转载出处: https://sanwen8.cn/p/2cenbHs.h ...