scala可变var与不可变val的理解
我们定义变量的时候分为var可变变量和val不可变变量。
我们使用容器的时候也分为可变容器和不可变容器。
List和Tuple本身就是不可变的,set和map分为可变和不可变的,默认为不可变。
我们看这样一个例子
|
1
2
|
var list = List(“Hello”,“World”);list += “Scala”; |
这样的一段代码怎么理解呢?var是可变的啊,List是不可变的,怎么能结合使用呢?List为啥还能添加元素呢?
首先,我们理解为啥List不可变还能添加元素。
我们原本的list是不可变的,这样没错。
我们在执行添加“Scala”时并不是在原本的List对象添加,而是新建一个List包含了Hello,World,Scala。
那么,var是可变的,List不可变,能结合使用有问题吗?
当然没有问题,我们定义变量所使用的是var和val指的是“指针”,他们和对象可不可变并没有任何关系。
如同例子来说,var list指向的对象是List(“Hello”,“World”),
我们可以修改list的指向,因为是var,所以后边list又可以指向新的List(“Hello”,“World”,“Scala”)。
如果我们定义把var list换成val list还能执行+=添加元素吗?结果是不能的。
理解完这些,我们来看下Set和Map。
这个例子和上面list例子一样理解。
|
1
2
|
var mySet = Set("Hello","World");//不可变的Set包名为 scala.collection.numutable.SetmySet += "Scala"; |
注意,我们这里并没有导入任何包,Set默认是不可变的。
我们定义一个可变的Set和一个不可变的指针。
|
1
2
3
|
import scala.collection.mutable.Setval mySet = Set("Hello","World");mySet += "Scala"; |
这样的一个例子我们怎么理解呢?
首先,我们在之前的例子中了解到
不可变的Set在添加元素的时候,原来的Set不变,生成一个新的Set来保存原来的Set+添加的元素;
当然可变的Set在添加元素的时候,并不用新生成一个Set,而是直接将元素添加到原来的Set中。
那么我们定义val不可变这样可以吗?
当然可以,因为你定义val不可变的只是指针,跟对象没有任何的关系,
只不过mySet指针不能修改,跟对象本身是否能修改没有任何关系。
Map同理。
scala可变var与不可变val的理解的更多相关文章
- scala (4) 可变数组和不可变数组
在scala中数组分为不可变长数组(在immutable包下)和可变长数组(在mutable包下) 不可变长数组指的是长度不可变,但是数组中角标对应的元素的值是可变的 可变数组指的是长度和数组中角标对 ...
- scala (5) 可变序列和不可变序列
/** * 序列分为可变长和不可变长,序列其实就是list,底层是链表结构 * 特点:插入有序,可重复,增加和移除元素很快,查询慢 * 不可变长序列:List * 可变长序列:ListBuffer * ...
- Python浅拷贝与深拷贝(可变对象与不可变对象)
第一次遇到深拷贝和浅拷贝的问题是用python在一个for循环中对一个list赋值,使用的语句是 a = b 这个b会不断带入循环,每次计算得到,最后发现list乱七八糟的,后来才发现,python中 ...
- 理解python可变类型vs不可变类型,深拷贝vs浅拷贝
核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...
- 【Python】可变对象和不可变对象
Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,flo ...
- 【转】不可变数组NSArray与可变数组NSMutableArray
原文网址:http://www.jianshu.com/p/1ad327f56d1d 不可变数组NSArray //创建一个空数组 NSArray *array = [NSArray array]; ...
- JAVA的可变类与不可变类
转自: http://www.blogjava.net/hilor/articles/150610.html 可变类和不可变类(Mutable and Immutable Objects)的初步定义: ...
- Python 可变对象和不可变对象
具体可以看这里:http://thomaschen2011.iteye.com/blog/1441254 不可变对象:int,string,float,tuple 可变对象 :list,dicti ...
- OC基础 可变字典与不可变字典的使用
OC基础 可变字典与不可变字典的使用 1.不可变字典 1.1创建不可变字典 //创建字典 //注意: //1,元素个数是偶数 //2,每两个元素是一个键值对 //3,值在前,键在后 NSDiction ...
随机推荐
- CodeChef Dynamic GCD
嘟嘟嘟vjudge 我今天解决了一个历史遗留问题! 题意:给一棵树,写一个东西,支持一下两种操作: 1.\(x\)到\(y\)的路径上的每一个点的权值加\(d\). 2.求\(x\)到\(y\)路径上 ...
- Python 输出文件内容到网络端口
Python 输出文件内容到网络端口 $ cat mySocketTest.py import sys import time import socket if __name__ == "_ ...
- TensorFlow基础
TensorFlow基础 SkySeraph 2017 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com Over ...
- Redhat6.4安装Oracle 11gr2 64位 注意事项
安装步骤略, 安装步骤参考:https://www.cnblogs.com/jhlong/p/5442459.html 注意的是,会出现找不到一些依赖库,我根据光盘已有的库安装了所有64位的依赖库,强 ...
- mybatis 使用缓存策略
mybatis中默认开启缓存 1.mybatis中,默认是开启缓存的,缓存的是一个statement对象. 不同情况下是否会使用缓存 同一个SqlSession对象,重复调用同一个id的<sel ...
- Centos下安装Mysql异常
问题1: [root@localhost install-files]# rpm -ivh MySQL-server-5.6.27-1.el6.x86_64.rpm --nosignaturePrep ...
- Filter过滤要登录的页面(重要)
一.为什么要写过滤器,过滤页面? 本人做了一个网站,目前还在开发.做过滤器的目的就是为了要过滤一些页面必需要用户登录之后才能看,主页什么的可以随便看,一旦涉及到要发布或评论什么信息,就必须要过滤用户的 ...
- 关于ESB(企业服务总线)的学习笔记
MQ(消息队列 message queues),它是一种应用程序对应用程序的通信方法.排队指的是应用程序通过队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求. Web Sevice 技术, ...
- 【题解】放球游戏A
题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.每个人一次只能放1至5个球,最后面对没有空格而不能放球的人为输. ...
- mpvue——另类支持v-html
前言 最近在用mpvue将之前写的vue项目转化为小程序,但是不支持v-html,也不能说不支持,只不过转化为了rich-text的富文本组件,但是图片显示不全啊 本来想让后端内嵌个样式的,还是算了, ...