Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ConcurrentHashMap foreach loop problem

I have a concurrenthashmap called users. I have user objects in it with some integer keys that is not id. I want to find the user with a given id. Therefore, I check all elements of hashmap and return the user object if it is present. Here is my code :

    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());
    }

However even tough my u.getId() and id are the same I cannot see "match" at my logs.

213 matches but It can not enter the following if statement. here are my logs:

enter image description here

What do you think about it?

like image 573
aykut Avatar asked Dec 27 '22 13:12

aykut


2 Answers

What type returned from User.getId() method and what type of id variable? If it is not a primitive type, you need to use equals() instead of ==.

By the way, a good static code analyzer like FindBugs can find such kind of errors.

like image 188
Eugene Kuleshov Avatar answered Dec 30 '22 02:12

Eugene Kuleshov


You haven't shown the types involved, but is it possible that id or getId() is an Integer instead of an int? If so, you'll be comparing references, so you should just use

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

to compare the values within the Integer objects. Be careful if getId can return null though...

like image 34
Jon Skeet Avatar answered Dec 30 '22 03:12

Jon Skeet