对比Java中String.intern()理解Scala中Symbol

相信很多人和我一样,在刚接触Scala时,会觉得Symbol类型很奇怪,既然Scala中字符串都是不可变的,那么Symbol类型到底有什么作用呢?

简单来说,相比较于String类型,Symbol类型有两个比较明显的特点:节省内存和快速比较。在进入正题之前,让我们先来了解一下Java中String的intern()方法。

一、String的intern方法介绍

Oracle的开发文档上讲解的很详细:String类内部维护一个字符串池(strings pool),当调用String的intern()方法时,如果字符串池中已经存在该字符串,则直接返回池中字符串引用,如果不存在,则将该字符串添加到池中,并返回该字符串对象的引用。执行过intern()方法的字符串,我们就说这个字符串被拘禁了(interned)。默认情况下,代码中的字符串字面量和字符串常量值都是被拘禁的,例如:

String s1 ="abc";String s2 =newString("abc");//返回true

System.out.println(s1 == s2.intern());

同值字符串的intern()方法返回的引用都相同,例如:

String s2 =newString("abc");String s3 =newString("abc");//返回trueSystem.out.println(s2.intern() == s3.intern());//返回false

System.out.println(s2 == s3);

二、Symbol类型的主要特点

下面接着介绍Symbol类型的两个特点。

1. 节省内存

在Scala中,Symbol类型的对象是被拘禁的(interned),任意的同名symbols都指向同一个Symbol对象,避免了因冗余而造成的内存开销。而对于String类型,只有编译时确定的字符串是被拘禁的(interned)。Scala测试代码如下:

val s ='aSymbol//输出trueprintln( s == 'aSymbol)//输出trueprintln( s == Symbol("aSymbol"))

2. 快速比较

由于Symbol类型的对象是被拘禁的(interned),任意的同名symbols都指向同一个Symbol对象,而不同名的symbols一定指向不同的Symbol对象,所以symbols对象之间可以使用操作符==快速地进行相等性比较,常数时间内便可以完成,而字符串的equals方法需要逐个字符比较两个字符串,执行时间取决于两个字符串的长度,速度很慢。(实际上,String.equals方法会先比较引用是否相同,但是在运行时产生的字符串对象,引用一般是不同的)

三、Symbol类型的应用

Symbol类型一般用于快速比较,例如用于Map类型:Map<Symbol, Data>,根据一个Symbol对象,可以快速查询相应的Data, 而Map<String, Data>的查询效率则低很多。

四、小结

利用String的intern方法也可以实现Map<String, Data>的键值快速比较,但是由于需要显式地调用intern()方法,在编码时会造成很多的麻烦,而且如果忘了调用intern()方法,还会造成难以寻找的bug。从这个角度看,Scala的Symbol类型不仅有效率上的提升,而且也简化了编码的复杂度。

转自

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 4,328评论 1 6
  • Scala Basic Literals Integer , Float , Boolean Symbol这个Sy...
    crazydane阅读 3,693评论 0 2
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 8,798评论 1 24
  • 生活中感觉自己是一个格局还算大的人,对待事情一般都能看得开,不会钻牛角尖或者陷入无休止的争论中。 格局很重要,人的...
    均沾阅读 4,200评论 0 1
  • 01 伊洛终于实现了自己的梦想,开了一家奶茶店,而且是在他学校的旁边,她给这间奶茶店起名叫做遇见,希望能跟他遇见。...
    一弓长阅读 2,507评论 0 0