如何在Clojure中检查字符串的相等性,而不需要调用java.lang.String?

41

在Clojure中有没有检查字符串相等性的方法?即,我需要知道它们的内容是否相等,而不是位置。

谢谢。

2个回答

61

Clojure中的等式(=函数)总是测试值,而不是身份,因此当两个字符串具有相同内容时,则它们是=

对于大多数Java类型,包括String,Clojure = 调用Java .equalsString.equals定义为“表示相同的字符序列”。

如果您想测试标识(这些指针是否指向内存中的相同位置?),请使用identical?函数。


我需要比较一个安全令牌,因此我需要一个函数来检查内容是否完全相同,不接受通配符或正则表达式。您知道Clojure的=函数是否满足我的需求,还是我需要更具体的函数? - jonathanrz
1
Clojure的=不使用通配符或正则表达式。 - Stuart Sierra

9
(= "hello" (str "hel" "lo"))
; => true 

Java虚拟机有一个字符串池,每个值最多只保存一个条目,因此身份和值相等是相同的比较。使用 StringBuilder.String. 可以绕过这一规则,但由于Clojure等式函数调用了 .equals 方法,如果身份不同,则会执行值比较。


13
(identical? "hello" (str "hel" "lo")) 返回 false。Java 的字符串池只针对常量字符串。因此,(identical? "hello" "hello") 为 true,但是一旦你计算出某个字符串,它就不会与其他任何字符串指向同一内存地址。你可以使用 (identical? "hello" (.intern (str "hel" "lo"))) 强制将字符串存储在池中并进行查找,这样结果为 true。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接