相信不少人和我同样,在刚接触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>的查询效率则低不少。
方法