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