天天看點

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内部維護了一個字元串池。

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://yq.aliyun.com/articles/668857

https://www.scala-lang.org/api/2.12.1/scala/Symbol.html

https://stackoverflow.com/questions/3554362/purpose-of-scalas-symbol

每天一點成長,歡迎指正!