【scala】可變與不可變的理解


我們定義變量的時候分為var可變變量和val不可變變量。

我們使用容器的時候也分為可變容器和不可變容器。

List和Tuple本身就是不可變的,set和map分為可變和不可變的,默認為不可變。

我們看這樣一個例子

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例子一樣理解。

var mySet = Set("Hello","World");//不可變的Set包名為 scala.collection.numutable.Set
mySet += "Scala";

注意,我們這里並沒有導入任何包,Set默認是不可變的。

我們定義一個可變的Set和一個不可變的指針。

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

這樣的一個例子我們怎么理解呢?

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

不可變的Set在添加元素的時候,原來的Set不變,生成一個新的Set來保存原來的Set+添加的元素;

當然可變的Set在添加元素的時候,並不用新生成一個Set,而是直接將元素添加到原來的Set中。

那么我們定義val不可變這樣可以嗎?

當然可以,因為你定義val不可變的只是指針,跟對象沒有任何的關系,

只不過mySet指針不能修改,跟對象本身是否能修改沒有任何關系。

Map同理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM