Java. ArrayList's contains method not working

后端 未结 2 1298
清歌不尽
清歌不尽 2021-01-29 16:03

I am checking if ArrayList contains object:

            List propertiesByName = getPropertiesByCategory(propertyCategory);
        for(Property p         


        
2条回答
  •  迷失自我
    2021-01-29 16:31

    To use contains method, you have to override equals() and hashCode() methods to achieve this. You can check this answer for implementation https://stackoverflow.com/a/16069158/1320616. Actually contains() will compare two objects. And to compare two objects you have to implement equals() method.

    Edit : Here are the full details

    So when you use contains() what it is doing is

    @Override public boolean contains(Object object) {
            Object[] a = array;
            int s = size;
            if (object != null) {
                for (int i = 0; i < s; i++) {
                    if (object.equals(a[i])) {
                        return true;
                    }
                }
            } else {
                for (int i = 0; i < s; i++) {
                    if (a[i] == null) {
                        return true;
                    }
                }
            }
            return false;
        }
    

    and if you don't implement equals() method in your class it will take the equals() method from the Object class which is

    public boolean equals(Object o) {
            return this == o;
    }
    

    So now it reduces to == is being used between two objects to compare them. When you put == between two objects, it compares on basis of two things (a) hashcodes of two objects (b) It uses toString() of the two objects.

    Each object has different hashcodes assigned to them. this is the reason why your contains() is not giving you correct results.

提交回复
热议问题