我正在遍历Parameter
个对象的集合,寻找Parameter.name = "Code"
。如果我找不到它,我默认为列表中的第一个参数,如下所示:
header = WBMessageFactory.getWBMessageDescriptor(Configuration.getWBHeaderIDString());
for (Parameter p : header.getSegment().getParameter()) {
if (p.getName() == "Code") {
String wbCode = raw.substring(p.getStartPosition().intValue(), p.getLength().intValue());
logger.info("Found WB code... " + wbCode);
body = WBMessageFactory.getWBMessageDescriptor(wbCode);
break;
}
}
if (body == null) {
Parameter p = header.getSegment().getParameter().get(0);
logger.error("Could not find Code parameter in Header template, using " + p.getName());
body = WBMessageFactory.getWBMessageDescriptor(raw.substring(p.getStartPosition().intValue(), p.getLength().intValue()));
}
如您所见,当我找不到Code时,我会记录Parameter
名称。 偶尔,日志记录显示以下内容:
Could not find Code parameter in Header template, using Code
任何人都可以解释发生了什么事吗?
答案 0 :(得分:7)
问题在于:
if (p.getName() == "Code") {
你可能想说
if (p.getName().equals("Code")) {
第一个compares the string reference,这几乎肯定不是你想要的。第二个比较字符串的内容。
答案 1 :(得分:5)
您的问题在以下一行:
if (p.getName() == "Code")
要检查字符串相等性,必须使用equals。
答案 2 :(得分:3)
您要将字符串与==
进行比较,您应该使用equals()
。如果您intern
这两个字符串,您可以将它们与==
进行比较,但是间接的字符串会被JVM保留很长时间,这可能被视为内存泄漏,并且微优化可能不是经常受益。