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

  • 相关阅读:
    如何使用 SPICE client (virt-viewer) 来连接远程虚拟机桌面?
    小米手机会不会更好
    5年一梦
    每天进步一点点——分布式文件系统下的本地缓存
    iOS开发中的NSDateFormatter日期格式解析总结
    IOS假设将一个十六进制的color转换成UIColor,非常有用
    HH实习(hpu1287)(斐波那契运用)
    学习用CMake来编写Qt程序
    【MFC设置静态文本框背景为透明】
    排序(3)---------冒泡排序(C语言实现)
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/8888749.html
Copyright © 2020-2023  润新知