Проблема цикла foreach ConcurrentHashMap - PullRequest
4 голосов
/ 26 сентября 2011

У меня есть concurrenthashmap, который называется users.У меня есть пользовательские объекты с некоторыми целочисленными ключами, которые не являются идентификаторами.Я хочу найти пользователя с заданным идентификатором.Поэтому я проверяю все элементы hashmap и возвращаю пользовательский объект, если он присутствует.Вот мой код:

    for(User u : users.values()) {
        logger.error("u.getId() : " + u.getId());
        logger.error("id : " + id );
        if( u.getId() == id ) {
            logger.error("match");
            return u;
        }
    }
    logger.error("Not found: id:" + id);
    for(User u : users.values()) {
        logger.error(u.getPos() + ". user: " + u.getId());
    }

Однако, несмотря на то, что мои u.getId () и id одинаковы, я не вижу "match" в моих журналах.

213 совпадений, но не может ввести следующий оператор if.вот мои журналы:

enter image description here

Что вы думаете об этом?

Ответы [ 2 ]

6 голосов
/ 26 сентября 2011

Какой тип возвращается из метода User.getId () и какой тип переменной id?Если это не примитивный тип, вам нужно использовать equals () вместо ==.

Кстати, хороший статический анализатор кода, такой как FindBugs , может найти такие ошибки.

4 голосов
/ 26 сентября 2011

Вы не указали задействованные типы, но возможно ли, что id или getId() будет Integer вместо int? Если это так, вы будете сравнивать ссылки , поэтому вы должны просто использовать

if (u.getId().equals(id))

для сравнения значений в Integer объектах. Будьте осторожны, если getId может вернуть ноль, хотя ...

...