我有以下功能,输入只是一个简单的字符串。
public X509CertificateHandler getCertByFingerprint(String thumbPrint) {
if (_thumbprintMap.containsKey(thumbPrint)) {
return _thumbprintMap.get(thumbPrint);
}
}
所以在我的测试用例中,我只是硬编码值只是为了测试它,但是我需要它们是大写的,所以我把它扔进Apache Common,简单吧?
certs.getCertByFingerprint(StringUtils.upperCase("eb55b661dd9133bc564aa259bcd0c598ce02892f"));
现在有趣的是,一旦我进入我的函数,传递给函数的String值与我预期的不同!
出于某种原因,在变量的开头似乎有某种null
!把它放在我的表情表中,我得到以下结果:
正如你所看到的,字符串前面有一个额外的[,
字符...这就是为什么我找不到我要从数组中找到的内容的原因!但为什么呢?
为了确保我没有疯狂,我运行了以下内容:
String fingerprint = "eb55b661dd9133bc564aa259bcd0c598ce02892f";
String f2 = StringUtils.upperCase(fingerprint);
f2.equals(fingerprint);
因为我正在初始化字符串,所以我无法在它前面获得null
..但是,上面的代码仍然在我的新字符串前面给了[,
。 .. wtf?
答案 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
)。