import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Teacher> arr = new ArrayList<>();
//创建一个Teacher类
Teacher tea = new Teacher("lisi", 16);
arr.add(tea);
//输出集合长度
System.out.println(arr.size());
System.out.println(arr.remove(tea));
System.out.println(arr.size());
}
}
class Teacher {
private String name;
private int age;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj){
return false;
}
}
运行上面这段程序会发现在集合中删除同一个元素失败了,ArrayList的remove(该方法为参数为Object对象)方法并没有将Teacher对象删除。而将其中equals方法写为:
@Override
public boolean equals(Object obj){
Teacher tea = (Teacher)obj;
return this.name.equals(tea.name) && this.age == tea.age;
}
集合中的元素就成功删除了。
根据ArrayList源码中remove方法的实现。如下:
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
可以发现调用的是存储类的equals方法,如果该类重写了equals方法,并直接返回false,调用remove方法将不会删除元素。
因此,在判断ArrayList集合中remove一个元素时,一定要知道该集合中类的equals方法,才可以判断集合中元素是否移除成功。