记录昨天在群里面学到的ArrayList的remove方法的特性,测试代码如下:
public class ListRemove
{
public static void main(String[] args)
{
List<Object> list = new ArrayList<Object>();
Student student = new Student();
Teacher teacher = new Teacher();
list.add(teacher);
list.remove(teacher);
System.out.println("remove(teacher)后list.size() = " + list.size());
list.remove(student);
System.out.println("remove(student)后list.size() = " + list.size());
}
}
class Student
{
@Override
public boolean equals(Object obj)
{
return true;
}
}
class Teacher
{
@Override
public boolean equals(Object obj)
{
return false;
}
}
方法最终的打印结果为:
remove(teacher)后list.size() = 1
remove(student)后list.size() = 0
结果分析(附录有ArrayList的remove方法源码):
1.当list调用remove方法remove(teacher)时,首先会调用teacher类中的equal方法判断两个对象是不是同一个对象,但由于teacher类中直接就返回了false,及teacher.equal(teacher) = false;则list中没有元素可以删除,故list.size()仍为1;
2.同理,当list调用remove方法remove(student)时,比较为true,即student.equals(teacher)=true,因此不管list中存放的是什么类型的数据,list都会remove成功。
3.在源码 中传入参数为student时o.equals(elementData[index])一直为true,删除成功。
附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;
}