This class provides a simple way to get unique objects for equal strings. Since symbols are interned, they can be compared using reference equality.javascript
symbols能夠做爲一種快速比較字符串的方式,若是字符串的值相同,則返回的symbol變量具備相同的引用地址。Symbol內部維護了一個字符串池。html
object SymbolDemo {
def main(args: Array[String]): Unit = { val s = 'nihao val n = 'nihao // return true println(s == n) } }
在Java中建立String實例有兩種方式:
一、直接給一個變量賦值;
二、用new關鍵建立String對象;(下文記做:方式1 和 方式2)java
方式1api
咱們都知道 「方式1」 每次都會建立一個新變量(因此for循環內拼接字符串不建議用 「+」 操做符,由於每次都會開闢一個新的內存)。但Java其實對該操做作了優化,在String類內部維護了一個字符串池,每次經過 「方式1」 建立String實例時,首先檢查字符串池中有沒有相同的字符串,若是字符串池中不存在該字符串,則將字符串放入字符串池中(此處開闢新內存),同時將字符串的引用地址賦值給變量;若是字符串池中存在該字符串,則直接將原有引用地址賦值給新變量。ide
當建立 「str1」 時,字符串池中沒有 「Hello Str」,此時將 「Hello Str」 放入字符串池中,並將內存地址賦值給 「str1」。當建立 「str2」時,字符串池中已經存在 「Hello Str」,直接將原有內存地址賦值給 「str2」,因此 「str1 == str2」 返回 true 。優化
方式2ui
每次都會建立一個新的對象,當調用 intern() 時邏輯過程跟 「方式1」 相同。當字符串池中存在 「Hello Str」時直接返回內存地址,不然將 「Hello Str」 放入字符串池中,並返回內存地址。url
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: spa
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-symbolscala