我們定義變量的時候分為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同理。