注意:使用List.contains(Object object)方法判斷ArrayList是否包含一個元素對象(針對於對象的屬性值相同,但對象地址不同的情況),如果沒有重寫List的元素對象Object中的equals方法,將導致contains方法始終返回false。
查看ArrayList的contains方法的源碼如下:
@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; }
可以看出,contains方法依據Object的equals方法來判斷是否包含某一元素,繼續查看Object類中的equals方法,源碼如下:
public boolean equals(Object o) { return this == o; }
所以,使用“==”比較對象的地址,如果是同一對象即地址相同的情況下,才會返回true,而對於對象屬性值相同但地址不同的不同對象,始終返回false!
如果需要依據對象屬性值是否相同來判斷ArrayList是否包含某一對象,則需要重寫Object的equals方法,並在equals方法中一一比較對象的每個屬性值,如:
public class Student { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object object) { if (this == object) { return true; } if (object instanceof Student) { Student student = (Student) object; return this.id.equals(student.id) && this.name.equals(student.name); } return super.equals(object); } }
如果該類中某屬性是其它類對象,則還需進一步重寫該類的equals方法!!
equals方法可通過eclipse中 shift+alt+s自動生成