import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List list=new ArrayList();
// Date d1=new Date();
// Date d2=new Date();
list.add("aa");
list.add(new Date());
System.out.println("移除前:"+list.size());
list.remove("aa");
list.remove(new Date());
System.out.println("移除后:"+list.size());
}
}
我的结果是
2
0
或者
2
1
如果代码结果没有随机,把注释的两行代码先执行一遍再注释掉,就会随机出现上面2中结果了
已经得到解答,就是hashcode和equals被重写了后跟当前时间有关,偶尔运行太快就new出来的两个Date的getTime()就一样了,谢谢大家
这是一个很好的基础问题,包含了对equals方法的理解,以及ArrayList的remove方法的理解。
为何remove("aa")就能够将add进去的"aa"给移除了,而new进去的Date却不能,还看似有随机性呢。
顺着这样的思考思路,就应该去查看ArrayList的remove方法。
通过源码查看能够看到,ArrayList的remove方法是要通过你所传进去的对象的equals来进行判断的,如果equals方法返回的是True那么就认定这两个对象是“相等”的,所以问题就转化为“Date的equals方法是如何判断两个对象相同的”。接下来查看Date的equals方法源码
看上面的代码十分简单,不用多说了,就是根据getTime()返回的毫秒数来判断的,虽然问题比较简单,但是这样思考问题的方式希望能够分享给提问的朋友。