为什么 List.contains(Object) 的行为不同?
Why does List.contains(Object) behaves differently?
根据 documentation 列表包含应该使用 equals()。意思是,如果对象中的值相同,它应该 return 为真。但是,在下面的示例中,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 对象时 return 为真,而在比较新的 Dog 对象时却不是?
我知道我可以通过覆盖 contains(Object) 来解决这个问题,但很想知道为什么这在默认情况下不起作用。
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")));
return false 因为 Hashcode 和 Equals 没有在 DOG Custom class 中实现。
在 java.lang.String class 中,hashCode() 方法也被重写,因此两个相等的字符串对象根据 equals() 方法将 return 相同的哈希码值。
根据 documentation 列表包含应该使用 equals()。意思是,如果对象中的值相同,它应该 return 为真。但是,在下面的示例中,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 对象时 return 为真,而在比较新的 Dog 对象时却不是?
我知道我可以通过覆盖 contains(Object) 来解决这个问题,但很想知道为什么这在默认情况下不起作用。
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")));
return false 因为 Hashcode 和 Equals 没有在 DOG Custom class 中实现。 在 java.lang.String class 中,hashCode() 方法也被重写,因此两个相等的字符串对象根据 equals() 方法将 return 相同的哈希码值。