如何在不调用java.lang.String的情况下检查clojure中字符串的相等性?

Mak*_*zin 36 clojure

在clojure中有没有办法检查字符串是否相等?即我需要知道,他们的内容是否相等,而不是位置.

谢谢.

Stu*_*rra 52

Clojure中的等式(=函数)总是测试值,而不是标识,所以=如果它们具有相同的内容,则两个字符串.

对于大多数Java类型,包括String,Clojure都会=调度到Java .equals.String.equals定义为"表示相同的字符序列".

如果你想测试身份(这些指针是否在内存中的相同位置?)使用该identical?功能.


Mik*_*las 8

(= "hello" (str "hel" "lo"))
; => true 
Run Code Online (Sandbox Code Playgroud)

JVM有一个字符串池,每个值最多保存一个条目,因此标识和值相等是相同的比较.有一些方法可以使用StringBuilder.,String.并且这不是严格正确的,但是因为clojure相等函数调用.equals,如果身份不同,将执行值比较.

  • `(相同?"你好"(str"hel""lo"))`是假的.Java的实习字符串池仅适用于常量字符串.所以`(相同的?"hello""hello")`是真的,但是一旦你计算了一些字符串就不会指针等于任何其他字符串.您可以用`(相同的?"hello"(.intern(str"hel""lo"))强制在池中查找/存储.)`(true) (13认同)