您可以使用Set
处理Map
所做的一切?这是对的吗?
Set
和Map
之间的语义差异是什么?
编辑:链接的“欺骗”没有列举两者之间的语义差异。
答案 0 :(得分:2)
我已经撤回了我的近距离投票。
快速google'设置与哈希表'或者'设置与hashmap'提出了大量的SO问题,主要是在Java标签中,但我没有看到一个单独的答案,实际上以一种良好的概念方式解决了差异(尽管有一些与相关资源有关)。
让我们从 的数据结构开始:即值的容器。这些值在大多数情况下都可以是任何值。有些数据结构是同质的,有些则不是。有些人有限制(例如,Map可以有任意键,但POJO只能有字符串或符号键),有些没有,有些是有序的,有些是不是等等。所有这些权衡通常归结为性能
Set是一种包含唯一值的数据结构。让我们与一个数组进行比较:
Array.from(new Set([1,2,2,3])).toString() === [1,2,2,3].toString();
// false
与数组或列表类似,JavaScript中的集合是线性的:您可以按顺序遍历它们*。但与数组(更像列表)不同,集合未编入索引。你不能说new Set(1)[0];
。
地图* ahem * 映射键到值(索引)。如果我有地图new Map([['a',1]])
,则.get('a')
将返回1
。对于地图而言,订单通常不被认为是重要的,即关键索引的用途。也不是唯一性:new Map([['a', 1], ['b', 1]])
将值1存储两次**,您可以从任一键访问它。
即使像我一样,你主要是一名自学成才的程序员,我强烈建议你熟悉基本的数据结构,因为它提供了对问题识别和一般解决方案的宝贵见解。如果您发现自己经常使用Array.prototype.shift
,则可能需要FIFO队列/链接列表。
*通常设置无序,插入顺序的保留是JavaScript的事情。
**底层实现可能只作为优化存储一次,但这是一个实现细节,对用户来说是不透明的。