文档章节

基本类型和操作之理解Symbol类型

柳哥
 柳哥
发布于 2014/06/05 23:43
字数 549
阅读 656
收藏 2

相信很多人和我一样,在刚接触scala时,会觉得Symbol类型很奇怪,既然Scala中字符串都是不可变的,那么Symbol类型到底有什么作用呢?简单来说,相比较于String类型Symbol类型有两个比较明显的特点:节省内存和快速比较。在进入正题之前,让我们先来了解一下Java中String的intern()方法。


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


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>的查询效率则低很多。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 206
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
用js来实现那些数据结构04(栈01-栈的实现)

  其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活。但是栈和队列这两种数据结构比数组更加的高效和可控。而在js中要想模拟栈,依据的主要形式也...

zaking
04/14
0
0
ES6 系列之模拟实现 Symbol 类型

前言 实际上,Symbol 的很多特性都无法模拟实现……所以先让我们回顾下有哪些特性,然后挑点能实现的……当然在看的过程中,你也可以思考这个特性是否能实现,如果可以实现,该如何实现。 回...

冴羽
06/12
0
0
理解和使用ES6中的Symbol

ES6中引入了一种新的基础数据类型:,不过很多开发者可能都不怎么了解它,或者觉得在实际的开发工作中并没有什么场景应用到它,那么今天我们来讲讲这个数据类型,并看看我们怎么来利用它来改...

一斤代码
07/11
0
0
5分钟彻底理解Object.keys

编者按:本文作者 刘博文(Berwin),W3C性能工作组成员,360导航高级前端工程师。Vue.js早期用户,《深入浅出Vue.js》(正在出版)作者。github主页:https://github.com/berwin 前几天一个朋...

奇舞周刊
07/26
0
0
低门槛彻底理解JavaScript中的深拷贝和浅拷贝

在说深拷贝与浅拷贝前,我们先看两个简单的案例: 按照常规思维,应该和一样,不会因为另外一个值的改变而改变,而这里的 却随着的改变而改变了。同样是变量,为什么表现不一样呢?这就要引入...

lunaqi
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
5
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
23
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
18
0
my.ini

1

architect刘源源
今天
16
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部