方法boolean java.util.List.remove(Object object)
何时以及为何返回false?
文档说明
[方法返回]如果此操作修改了此List,则返回true, 否则就是假的。
为什么操作不会对列表生效?
(注意:我正在使用的列表的实现是ArrayList
)
更新
我想要删除的对象确实存在于List中。我将类添加到List
(因此参数this
)并将this
(在同一个类中)传递给remove方法。因此,对象应存在于List中(或不存在?)。
更新
这是代码。看看delay()
方法。我试图从List
中删除相应的类。
public class Timer extends Object {
private static List<Timer> allTimers;
private Long startTime;
private int delayTime;
private boolean registered;
String name;
public Timer(String name) {
this.name = name;
this.registered = true;
allTimers.add(this);
Log.d("SpaceDroid", "Foo: Created timer: " + name + " Size: " + this.allTimers.size());
}
public Timer(String name, int delayTime) {
this(name);
this.delayTime = delayTime;
}
public void setDelayTime(int delayTime) {
this.delayTime = delayTime;
}
public boolean delay() {
if(this.startTime == null) {
this.startTime = System.currentTimeMillis();
}
if(startTime + this.delayTime < System.currentTimeMillis()) {
if(this.registered) {
Log.d("SpaceDroid", "Foo: Trying to remove timer: " + name);
if(this.allTimers.remove(this)) {
Log.d("SpaceDroid", "Foo: Successfully removed timer: " + name);
}
else {
Log.d("SpaceDroid", "Foo: Did not remove timer: " + name);
}
}
return true;
}
else {
return false;
}
}
// The same as resume, just renew the startTime
public void reset() {
this.startTime = null;
this.registered = true;
this.allTimers.add(this);
}
public void resume() {
this.startTime = System.currentTimeMillis();
}
public void pause() {
// Check if timer is still running
if(!this.delay()) {
// Calculate new delayTime
delayTime = (int) ((startTime + this.delayTime) - System.currentTimeMillis());
Log.d("SpaceDroid", "Foo: New delay time: " + delayTime + " for timer: " + name);
}
}
public static void resumeAllTimers() {
List<Timer> timers = new ArrayList<Timer>(Timer.allTimers);
for (Timer timer : timers) {
timer.resume();
}
}
public static void pauseAllTimers() {
List<Timer> timers = new ArrayList<Timer>(Timer.allTimers);
for (Timer timer : timers) {
timer.pause();
}
}
public static void disposeAllTimers() {
Timer.allTimers.clear();
Timer.allTimers = null;
}
public static void initializeAllTimers() {
allTimers = new ArrayList<Timer>();
}
}
答案 0 :(得分:7)
如果传入的Object
实际上不在列表中,则不会对列表产生任何影响,因此返回false。
编辑(谢谢Jai):
该方法使用特定的Object
s equals()
方法来确定它是否包含该对象。因此,如果您有自定义对象,请确保覆盖equals()
方法,以及hashCode()
(以维护方法之间的常规协定)。
答案 1 :(得分:2)
由于List是一个接口,因此它不具有示例的具体实现。但是从ArrayList中获取它将返回 false if:
来自ArrayList.java
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;
}
添加fastRemove的代码,完整性:
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
}
证明:
public static void main(String[] args) {
ArrayList l = new ArrayList();
System.out.println("Removing null on empty list: " + l.remove(null));
System.out.println("Removing an object that won't be found: " + l.remove(new Object()));
}
结果:
Removing null on empty list: false
Removing an object that won't be found: false
答案 2 :(得分:0)
来自doc
从此列表中删除第一次出现的指定元素, 如果它存在(可选操作)。如果此列表不包含 元素,它没有变化。更正式地说,删除元素 最低的索引i使得(o == null?get(i)== null: o.equals(get(i)))(如果存在这样的元素)。如果是这样返回true list包含指定的元素(或等效地,如果此列表 因呼叫而改变了。)