Java foreach循环找不到现有的列表元素

时间:2011-10-06 10:46:17

标签: java foreach

我正在遍历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

任何人都可以解释发生了什么事吗?

3 个答案:

答案 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保留很长时间,这可能被视为内存泄漏,并且微优化可能不是经常受益。