何时以及为什么List remove(Object object)返回false

时间:2013-04-20 12:30:20

标签: java list

方法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>();

    }


}

3 个答案:

答案 0 :(得分:7)

如果传入的Object实际上不在列表中,则不会对列表产生任何影响,因此返回false。

编辑(谢谢Jai): 该方法使用特定的Object s equals()方法来确定它是否包含该对象。因此,如果您有自定义对象,请确保覆盖equals()方法,以及hashCode()(以维护方法之间的常规协定)。

答案 1 :(得分:2)

由于List是一个接口,因此它不具有示例的具体实现。但是从ArrayList中获取它将返回 false if:

  • 传递null并且列表中没有空对象,或
  • 您传递了列表中未找到的对象

来自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包含指定的元素(或等效地,如果此列表   因呼叫而改变了。)