Scala Symbol笔记

简介: Symbol This class provides a simple way to get unique objects for equal strings. Since symbols are interned, they can be compared using reference equality. symbols可以作为一种快速比较字符串的方式,如果字符串的值相同,则返回的symbol变量具有相同的引用地址。

Symbol

This class provides a simple way to get unique objects for equal strings. Since symbols are interned, they can be compared using reference equality.

symbols可以作为一种快速比较字符串的方式,如果字符串的值相同,则返回的symbol变量具有相同的引用地址。Symbol内部维护了一个字符串池。

object SymbolDemo {
  def main(args: Array[String]): Unit = {
    val s = 'nihao
    val n = 'nihao
    // return true
    println(s == n)
  }
}

Compare to Java

在Java中创建String实例有两种方式:
1、直接给一个变量赋值;
2、用new关键创建String对象;(下文记作:方式1 和 方式2)

方式1

我们都知道 “方式1” 每次都会创建一个新变量(所以for循环内拼接字符串不建议用 “+” 操作符,因为每次都会开辟一个新的内存)。但Java其实对该操作做了优化,在String类内部维护了一个字符串池,每次通过 “方式1” 创建String实例时,首先检查字符串池中有没有相同的字符串,如果字符串池中不存在该字符串,则将字符串放入字符串池中(此处开辟新内存),同时将字符串的引用地址赋值给变量;如果字符串池中存在该字符串,则直接将原有引用地址赋值给新变量。

当创建 “str1” 时,字符串池中没有 “Hello Str”,此时将 “Hello Str” 放入字符串池中,并将内存地址赋值给 “str1”。当创建 “str2”时,字符串池中已经存在 “Hello Str”,直接将原有内存地址赋值给 “str2”,所以 “str1 == str2” 返回 true 。

方式2

每次都会创建一个新的对象,当调用 intern() 时逻辑过程跟 “方式1” 相同。当字符串池中存在 “Hello Str”时直接返回内存地址,否则将 “Hello Str” 放入字符串池中,并返回内存地址。

public class Demo {

  public static void main(String[] args) {
    String str1 = "Hello Str";
    String str2 = "Hello Str";
    String str3 = new String("Hello Str");
    // return true
    System.out.println(str1 == str2);
    // return false
    System.out.println(str1 == str3);

    // return true
    System.out.println(str1 == str3.intern());
  }

}

Refer from:
https://www.scala-lang.org/api/2.12.1/scala/Symbol.html
https://stackoverflow.com/questions/3554362/purpose-of-scalas-symbol

目录
相关文章
|
分布式计算 Scala Spark
Scala写Spark笔记
Scala写Spark笔记
67 0
|
Scala
疑似bug_中文代码示例之Programming in Scala笔记第九十章
对Programming in Scala书本中的九十章示例代码进行命名中文化, 发现一个问题. Translate identifiers in sample programs to Chinese, and found an issue.
755 0
|
Scala
中文代码示例之Programming in Scala笔记第七八章
对Programming in Scala书本中的七八章示例代码进行命名中文化. Translate identifiers in sample programs to Chinese.
738 0
|
缓存 Scala
中文代码示例之Programming in Scala笔记第四五六章
对Programming in Scala书本中的四五六章示例代码进行命名中文化. Translate identifiers in sample programs to Chinese.
593 0
|
分布式计算 Java 大数据
《Scala入坑笔记》一、Scala简介
Scala 是 Scalable Language 的简写,网上没有发现谁问 Scala 怎么读,你是按 Scalable 的发音读作 ['skeɪlə] 还是喜欢读作斯卡拉? Scala 是一门多范式的能够运行于JVM和.Net平台之上的编程语言,一种类似java的编程语言 ,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。
1375 0
|
Java Apache Scala
《Scala入坑笔记》缘起 3天就搞了一个 hello world
有小伙伴向我咨询 play framework 的问题,我就想了解一下 play framework ,按照官方的文档,要使用 SBT 安装,就掉进了 SBT 的坑。 第一坑:国外仓库太慢 安装完成后,执行 $ sbt命令后,提示: Java HotSpot(TM) 64-Bit Serve...
1868 0