为什么我的新字符串前面有空?

Why is there null in front of my fresh String?

我有以下函数,输入只是一个简单的字符串。

public X509CertificateHandler getCertByFingerprint(String thumbPrint) {
    if (_thumbprintMap.containsKey(thumbPrint)) {
        return _thumbprintMap.get(thumbPrint);
    }
}

所以在我的测试用例中,我只是硬编码值只是为了测试它,但是我需要它们是大写的,所以我把它扔到 Apache Common 中,简单吧?

certs.getCertByFingerprint(StringUtils.upperCase("‎eb55b661dd9133bc564aa259bcd0c598ce02892f"));

现在有趣的是,一旦我进入我的函数,传递给函数的字符串值与我预期的不同!

出于某种原因,变量的开头似乎有一个 null !把它放在我的表情表中,我得到以下信息:

如您所见,字符串前面多了一个[,字符...这就是我无法从我的数组中找到我要查找的内容的原因!但是为什么?

为了确保我没有发疯,我 运行 以下内容:

String fingerprint = "‎eb55b661dd9133bc564aa259bcd0c598ce02892f";
String f2 = StringUtils.upperCase(fingerprint);
f2.equals(fingerprint);

因为我初始化了字符串,所以我无法在它前面得到一个 null ..但是,上面的代码仍然在我新鲜的前面给了我 [,字符串... wtf?

您的字符串开头有一个不可见字符 LEFT-TO-RIGHT MARK。尝试 运行 这一行:

System.out.println(
        "eb55b661dd9133bc564aa259bcd0c598ce02892f".length() < 
        "‎eb55b661dd9133bc564aa259bcd0c598ce02892f".length()
);

输出:

true

它们看起来相同,但第二个有你的隐藏角色。抓住第一个字符串,你应该很好。

首先让我简单谈谈您对 null 值的第一个假设。当您查看 String 的实现时,您会看到 String 使用 char[] 作为后备存储。在 Java 中,不可能将 null 值存储在原始数组中。

然而,在这行代码中"e之间有一个不可见的字符:

String fingerprint      = "‎eb55b661dd9133bc564aa259bcd0c598ce02892f";
String fingerprintFixed = "eb55b661dd9133bc564aa259bcd0c598ce02892f";

如图所示,这些String有不同的长度。 只需将光标置于 "e 之间,按删除键即可开始(或从上面复制 fingerprintFixed)。