为什么List.contains(Object)的行为有所不同?

时间:2019-07-30 17:34:37

标签: java list arraylist equals contains

根据documentation包含的列表,应该使用equals()。意思是,如果对象中的值相同,则应返回true。但是,在下面的示例中,contains(Object)的行为有所不同:

import java.util.ArrayList;
import java.util.List;

public class Dog{

    private String name;
    private int age;
    private String colour;

    public Dog(String name, int age, String colour){
        this.name = name;
        this.age = age;
        this.colour = colour;
    }

    public static void main(String []args){

        List<String> names = new ArrayList<>();
        String name1 = "adam";
        names.add(name1);
        System.out.println(names.contains(new String("adam")));  //returns true

        List<Dog> dogs = new ArrayList<>();
        Dog fido = new Dog("fido", 2, "black");
        dogs.add(fido);
        System.out.println(dogs.contains(new Dog("fido", 2, "black"))); // returns false
    }

}

为什么在比较新的String对象时返回true,而不是在比较新的Dog对象时返回true?

我知道我可以通过覆盖contains(Object)来解决此问题,但很好奇为什么默认情况下不起作用。

1 个答案:

答案 0 :(得分:1)

password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")

由于Hashcode返回false,因此在DOG Custom类中未实现等于。 在java.lang.String类中,hashCode()方法也被覆盖,以便根据equals()方法的两个相等的字符串对象将返回相同的哈希码值。