【发布时间】:2019-12-08 04:08:17
【问题描述】:
根据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对象时不返回?
我知道我可能可以通过覆盖 contains(Object) 来解决这个问题,但很想知道为什么默认情况下这不起作用。
【问题讨论】:
-
你需要重写Dog类中的equals方法
-
因为
String.equals()与Dog.equals()不同,Dog.equals()继承自身份相等的Object.equals()(==)
标签: java list arraylist equals contains