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
每天一點成長,歡迎指正!