Answers:
再次,我变得不耐烦并在Freenode上的#clojure中询问了我自己的问题。在Stackoverflow.com上鼓励回答您自己的问题的好方法:D
我与Rich Hickey进行了简短的讨论,这就是要点。
[12:21] <Raynes> Vectors aren't seqs, right?
[12:21] <rhickey> Raynes: no, but they are sequential
[12:21] <rhickey> ,(sequential? [1 2 3])
[12:21] <clojurebot> true
[12:22] <Raynes> When would you want to use a list over a vector?
[12:22] <rhickey> when generating code, when generating back-to-front
[12:23] <rhickey> not too often in Clojure
如果您已经做了大量Java编程,并且熟悉Java集合框架,那么可以考虑使用list LinkedList
以及vectors这样的向量ArrayList
。因此,您几乎可以以相同的方式选择容器。
为了进一步说明:如果您打算将项目分别添加到序列的前面或后面很多,则链表比矢量要好得多,因为不需要每次都在项目周围进行随机排序。但是,如果您想频繁获取特定元素(不在列表的前面或后面)(即随机访问),则需要使用vector。
顺便说一下,向量可以很容易地变成序列。
user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
ArrayList
没有有效地重新实现ArrayDeque
自己。
向量具有O(1)个随机访问时间,但是必须预先分配。列表可以动态扩展,但是访问随机元素为O(n)。
何时使用向量:
何时使用清单:
~O(1)
对于那些对此费用解释可能有所帮助的人来说-stackoverflow.com/questions/200384/constant-amortized-time
简要说明一下:
“我读到Vector不是seq,而List是。”
序列比列表或向量(或图或集合)更通用。
不幸的是,REPL会以相同的方式打印列表和序列,因为即使它们不同,它实际上也会使列表看起来像是序列。(seq)函数将从包括列表在内的许多不同事物中构成一个序列,然后您可以将该seq馈送到对seqs做一些漂亮事情的众多函数中的任何一个。
user> (class (list 1 2 3))
clojure.lang.PersistentList
user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList
user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq
Sec有一个快捷方式,如果已经是seq,则返回其参数:
user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
列表是序列,尽管其他事物也是如此,并非所有序列都是列表。
class
代替class?
吗?
clojure.lang.PersistentList
了我。我假设你的意思是写class
不class?
。
class
针对您提到的这两个表达式返回相同的PersistentList,这意味着序列和列表确实是完全一样的东西吗?