【scala】可變與不可變的理解
我們定義變數的時候分為var可變變數和val不可變變數。
我們使用容器的時候也分為可變容器和不可變容器。
List和Tuple本身就是不可變的,set和map分為可變和不可變的,預設為不可變。
我們看這樣一個例子
1 2 |
|
這樣的一段程式碼怎麼理解呢?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 |
|
注意,我們這裡並沒有匯入任何包,Set預設是不可變的。
我們定義一個可變的Set和一個不可變的指標。
1 2 3 |
|
這樣的一個例子我們怎麼理解呢?
首先,我們在之前的例子中瞭解到
不可變的Set在新增元素的時候,原來的Set不變,生成一個新的Set來儲存原來的Set+新增的元素;
當然可變的Set在新增元素的時候,並不用新生成一個Set,而是直接將元素新增到原來的Set中。
那麼我們定義val不可變這樣可以嗎?
當然可以,因為你定義val不可變的只是指標,跟物件沒有任何的關係,
只不過mySet指標不能修改,跟物件本身是否能修改沒有任何關係。
Map同理。