文档章节

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

柳哥
 柳哥
发布于 2014/06/05 23:43
字数 549
阅读 653
收藏 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>的查询效率则低很多。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 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
低门槛彻底理解JavaScript中的深拷贝和浅拷贝

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

lunaqi
05/11
0
0
5分钟彻底理解Object.keys

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

奇舞周刊
07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
54
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部