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;
}
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方法的理解,以及ArrayList的remove方法的理解。
为何remove("aa")就能够将add进去的"aa"给移除了,而new进去的Date却不能,还看似有随机性呢。
顺着这样的思考思路,就应该去查看ArrayList的remove方法。
通过源码查看能够看到,ArrayList的remove方法是要通过你所传进去的对象的equals来进行判断的,如果equals方法返回的是True那么就认定这两个对象是“相等”的,所以问题就转化为“Date的equals方法是如何判断两个对象相同的”。接下来查看Date的equals方法源码
看上面的代码十分简单,不用多说了,就是根据getTime()返回的毫秒数来判断的,虽然问题比较简单,但是这样思考问题的方式希望能够分享给提问的朋友。
public boolean remove(Object o) {
这是ArrayList的源码,首先通过代码可以看到,当移除成功后返回true,否则返回false。remove(Object o)中通过遍历element寻找是否存在传入对象,一旦找到就调用fastRemove移除对象。你两次new date()的不是一个对象。找不到肯定不会remove。你可以在代码中间加上sleep试试
试了一下,是可能会出现。
看Date的默认构造函数是
即使用当前的时间作为参数,所以执行时间太短的时候可能会导致两个new Date()实例化两个相等的对象。
Date的equals()方法较复杂,没有仔细分析。不过知道这些,应该差不多了吧。
测试了一下:代码如下: