相信不少人和我同樣,在剛接觸scala時,會以爲Symbol類型很奇怪,既然Scala中字符串都是不可變的,那麼Symbol類型到底有什麼做用呢?簡單來講,相比較於String類型,Symbol類型有兩個比較明顯的特色:節省內存和快速比較。在進入正題以前,讓咱們先來了解一下Java中String的intern()方法。spa
1. String的intern方法介紹
Oracle的開發文檔上講解的很詳細:String類內部維護一個字符串池,當調用String的intern()方法時,若是字符串池中已經存在該字符串,則直接返回池中字符串引用,若是不存在,則將該字符串添加到池中,並返回該字符串對象的引用。執行過intern()方法的字符串,咱們就說這個字符串被拘禁了(interned)。默認狀況下,代碼中的字符串字面量和字符串常量值都是被拘禁的。scala
2. Symbol類型的主要特色對象
a. 節省內存內存
在scala中,Symbol類型的對象是被拘禁的,任意的同名符號字面量或者Symbol對象都指向同一個Symbol對象,避免了因冗餘而形成的內存開銷。例如:開發
注意:上例中,Symbol(「aSymbol」)表示的工廠方法調用(這個地方還有點不明白!!!!)文檔
b. 快速比較字符串
因爲Symbol類型的對象是被拘禁的,任意的同名符號字面量或Symbol對象都指向同一個Symbol對象,而不一樣名的符號字面量或Symbol對象必定指向不一樣的Symbol對象,因此Symbol對象之間可使用操做符:== 快速地進行相等性比較。而字符串的equals方法須要逐個字符比較兩個字符串,執行時間取決於兩個字符串的長度,速度很慢。效率
3. Symbol類型的應用引用
Symbol類型通常用於快速比較,例如用於Map類型:Map<Symbol,Data>,根據一個Symbol對象,能夠快速查詢相應的Data,而Map<String,Data>的查詢效率則低不少。
方法