它是如何工作的?
(序列#{3 1 22 44})
为什么顺序会像
(1 3 44 22)
因为根据定义,集合数据结构是无序的:http://en.wikipedia.org/wiki/Set_(data_struct)
更准确地说,Clojure 的内置集(#{blah blah blah}
给你)是一个哈希集——也就是说,一个由哈希表支持的集合(http://en.wikipedia.org/wiki/Hash_tables)。它为您提供以下保证:
- 每个元素的唯一性(不允许重复)。
- 插入和遏制检查的 O(1) 性能特征。
- 迭代工作——调用
seq
将为您提供集合中的每个元素,但顺序未定义。
这里,未定义的顺序意味着迭代顺序取决于您在集合中插入的元素、它们的数量、插入它们的顺序、您之前可能在该集合上尝试过的所有其他操作以及各种其他实现细节这可能会从一种语言版本更改为另一种语言版本(甚至在实现之间 - 您可能并且可能会在 Clojure、在 64 位 JVM 上运行的 Clojure 或 ClojureScript 中得到不同的结果)。
重要的是,如果您正在编写与集合(或映射)一起使用的代码,切勿使其依赖于所述集合/映射中的任何顺序概念。它会坏掉的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)