我们定义变量的时候分为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.Set
mySet += "Scala";

注意,我们这里并没有导入任何包,Set默认是不可变的。

我们定义一个可变的Set和一个不可变的指针。

1
2
3
import scala.collection.mutable.Set
val mySet = Set("Hello","World");
mySet += "Scala";

这样的一个例子我们怎么理解呢?

首先,我们在之前的例子中了解到

不可变的Set在添加元素的时候,原来的Set不变,生成一个新的Set来保存原来的Set+添加的元素;

当然可变的Set在添加元素的时候,并不用新生成一个Set,而是直接将元素添加到原来的Set中。

那么我们定义val不可变这样可以吗?

当然可以,因为你定义val不可变的只是指针,跟对象没有任何的关系,

只不过mySet指针不能修改,跟对象本身是否能修改没有任何关系。

Map同理。

scala可变var与不可变val的理解的更多相关文章

  1. scala (4) 可变数组和不可变数组

    在scala中数组分为不可变长数组(在immutable包下)和可变长数组(在mutable包下) 不可变长数组指的是长度不可变,但是数组中角标对应的元素的值是可变的 可变数组指的是长度和数组中角标对 ...

  2. scala (5) 可变序列和不可变序列

    /** * 序列分为可变长和不可变长,序列其实就是list,底层是链表结构 * 特点:插入有序,可重复,增加和移除元素很快,查询慢 * 不可变长序列:List * 可变长序列:ListBuffer * ...

  3. Python浅拷贝与深拷贝(可变对象与不可变对象)

    第一次遇到深拷贝和浅拷贝的问题是用python在一个for循环中对一个list赋值,使用的语句是 a = b 这个b会不断带入循环,每次计算得到,最后发现list乱七八糟的,后来才发现,python中 ...

  4. 理解python可变类型vs不可变类型,深拷贝vs浅拷贝

    核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...

  5. 【Python】可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容是可变的,例如list.而不可变的对象则相反,表示其内容不可变. 不可变对象:int,string,flo ...

  6. 【转】不可变数组NSArray与可变数组NSMutableArray

    原文网址:http://www.jianshu.com/p/1ad327f56d1d 不可变数组NSArray //创建一个空数组 NSArray *array = [NSArray array]; ...

  7. JAVA的可变类与不可变类

    转自: http://www.blogjava.net/hilor/articles/150610.html 可变类和不可变类(Mutable and Immutable Objects)的初步定义: ...

  8. Python 可变对象和不可变对象

    具体可以看这里:http://thomaschen2011.iteye.com/blog/1441254 不可变对象:int,string,float,tuple 可变对象   :list,dicti ...

  9. OC基础 可变字典与不可变字典的使用

    OC基础 可变字典与不可变字典的使用 1.不可变字典 1.1创建不可变字典 //创建字典 //注意: //1,元素个数是偶数 //2,每两个元素是一个键值对 //3,值在前,键在后 NSDiction ...

随机推荐

  1. PHP奇淫技巧

    https://www.jb51.net/list/list_67_1.htm PHP技巧:https://www.jb51.net/list/list_67_13.htm mysql三范式 1NF: ...

  2. Nodejs OracleDB详细解读

    //导入oracledb模块 //基于版本@3.0.1 安装指令npm install oracledb //node访问oracleDB需要搭建访问环境,否则无法正常访问 //创建Oracle对象 ...

  3. 012_call和apply区别

    一. function fn(a,b) { console.log(this); } fn.call(null,1,2); //call为参数方式 fn.apply(null,[1,2]); //ap ...

  4. python小白——进阶之路——day3天-———运算符

    (1)算数运算符:  + - * / // % ** (2)比较运算符:  > < >= <= == != (3)赋值运算符:  = += -= *= /= //= %= ** ...

  5. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤

    1.插入贴膜卡和sim卡:进入“设置—电话—sim卡应用程序”选择CDMA电信解锁: 2.越狱设备,添加cydia.gpplte.com源,安装“6S/6/5S/5C/5电信新补丁”: 3.打卡gpp ...

  6. ubuntu安装docker{ubuntu16.04下安装docker}

       一.开始安装 第一步:   由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine d ...

  7. codeforces#983 B. XOR-pyramid (dp)

    参考博客:https://www.01hai.com/note/av137952. 题意:首先定义 (b代表一个数组) 给出一个区间,l,r,求它最大的连续子序列的函数值 分析: 定义dp[x][y] ...

  8. java中内存分配

    java程序运行时内存分配详解  一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一 ...

  9. springboot maven 报错ArtifactDescriptorException

    maven具体报错提示如下: Description Resource Path Location TypeArtifactDescriptorException: Failed to read ar ...

  10. ST表

    ST表的原理及其实现 ST表类似树状数组,线段树这两种算法,是一种用于解决RMQ(Range Minimum/Maximum Query,即区间最值查询)问题的离线算法 与线段树相比,预处理复杂度同为 ...