zoukankan      html  css  js  c++  java
  • 【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同理。

  • 相关阅读:
    hortonworks
    使用Ambari快速部署Hadoop大数据环境
    js模板引擎
    Scala中的语言特性是如何实现的2
    IOS多线程编程一:概述
    Struts框架
    总体设计
    算法介绍
    社区与关怀
    从C#的Singleton设计模式
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/8888749.html
Copyright © 2011-2022 走看看