带对象的ArrayList不包含值的问题通常是由于对象的相等性判断不正确导致的。在Java中,ArrayList使用equals()方法来判断两个对象是否相等。如果你的对象没有重写equals()方法,那么它将使用Object类的默认实现,即比较对象的内存地址是否相同。因此,即使两个对象的属性值相同,但它们的内存地址不同,equals()方法也会返回false。
为了解决这个问题,你需要在自定义对象中重写equals()方法和hashCode()方法。equals()方法应该比较对象的属性值是否相等,而hashCode()方法应该返回对象属性值的哈希值。这样,ArrayList就可以正确地判断对象是否相等,并准确地包含或不包含特定的对象。
以下是一个示例代码,演示如何重写equals()方法和hashCode()方法:
public class MyObject {
private String name;
private int age;
public MyObject(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObject myObject = (MyObject) o;
return age == myObject.age &&
Objects.equals(name, myObject.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
在这个示例中,我们定义了一个MyObject类,它有两个属性:name和age。我们重写了equals()方法和hashCode()方法,以便它们可以比较对象的属性值是否相等。
现在,如果你将MyObject对象添加到ArrayList中,并尝试添加具有相同属性值的另一个MyObject对象,那么ArrayList将正确地识别它们是相等的,并且不会将第二个对象添加到列表中。
领取专属 10元无门槛券
手把手带您无忧上云