在java中如果调用了ArrayList中的remove方法,其本质上是将要remove的对象与list中的每一个对象进行比较,比较的方法是调用Object中的equals方法,本质上是比较2个对象的内存地址是否一样。如下面的代码:我们想删除一个Employee对象,所以我们就new了一个和原来Employee对象内容完全一样的对象,很显然这样是不能remove掉的,因为调用remove方法的时候其实是调用Employee中的equals方法,因为Employee类并没有重写Object的equals方法,所以调用的还是Object的equals方法,本质上是比较2个对象的内存地址,显然是不一样的。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest4 {
/**
* @param args
*/
public static void main(String[] args) {
List<Employee> empList = new ArrayList<Employee>();
empList.add(new Employee(1,"jack"));
Employee emp1 = new Employee(2,"tom");
empList.add(emp1);
//jack
Employee emp11 = new Employee(1,"jack");
//调用的是emp的equals方法
empList.remove(emp11);
Iterator it = empList.iterator();
while(it.hasNext()){
Employee emp = (Employee)it.next();
System.out.println("name:"+emp.getName());
}
}
}
如果要实现上面的代码,我们就要在Employee类中重写Object的equals方法,代码如下:
import java.util.Date;
public class Employee {
private int empID;
private String name;
private Date birthday = new Date();
private float salary = 3000.0f;
public Employee(int empID, String name) {
this.empID = empID;
this.name = name;
}
public int getEmpID() {
return empID;
}
public void setEmpID(int empID) {
this.empID = empID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
@Override
public boolean equals(Object obj) {
boolean flag = obj instanceof Employee;
if(flag == false){
return false;
}
Employee emp = (Employee)obj;
if(this.getEmpID()==emp.getEmpID() && this.getName().equals(emp.getName())){
return true;
}else {
return false;
}
}
}
这样的话就能实现了,重写后的equals方法实质上是比较Employee对象中的内容,ArrayList中的contains方法的实现也是这样的