• 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.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同理。

  • 相关阅读:
    数据库中的Convert
    xml Data Type Methods in sql server
    WITH common_table_expression (Transact-SQL)
    NuGet配置代理
    SQL Source Control
    3线-8线译码器
    git commit template
    PowerShell中和服务相关的命令
    how to backup and restore database of SQL Server
    上升时间最长的序列
  • 原文地址:https://www.cnblogs.com/zhangqian27/p/10002725.html
Copyright © 2020-2023  润新知