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

时间:2017-05-12 20:58:39

标签: java string apache-commons

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

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

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

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

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

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

enter image description here

正如你所看到的,字符串前面有一个额外的[,字符...这就是为什么我找不到我要从数组中找到的内容的原因!但为什么呢?

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

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

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

2 个答案:

答案 0 :(得分:3)

你的字符串开头有一个隐形字符LEFT-TO-RIGHT MARK。尝试运行此行:

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

输出:

true

他们看起来相同,但第二个有隐藏的角色。抓住第一根弦,你应该很好。

答案 1 :(得分:1)

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

但是,在这行代码中"e之间存在一个不可见的字符:

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

如图in shmosel's answer所示,这些String的长度不同。 只需将光标设置在"e之间,点击删除键即可开始(或从上方复制fingerprintFixed)。