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

  • 相关阅读:
    已知sim3相似变换矩阵,如何求解出R, s, t ,从sim3相似变换矩阵中恢复和获得尺度、旋转、平移
    dynamic_cast用法总结
    为什么不建议用 equals 判断对象相等?
    玩转 Java 动态编译,秀了秀了~!
    如何不改表结构动态扩展字段?
    Java 中 long 是不是原子操作?
    7 个超实用的 MySQL 语句写法,让同事们眼前一亮!
    Spring Boot 集成 Flyway,数据库也能做版本控制,太牛逼了!
    Dubbo 的设计思想,真优秀!
    一个高性能、小而美的序列化工具!
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/8888749.html
Copyright © 2020-2023  润新知