2013-04-20 109 views
0

何时以及为什么boolean java.util.List.remove(Object object)方法返回false?什么时候和为什么List remove(Object object)返回false

文档状态

[该方法返回]如果此列表是由该操作, 假以其它方式修改。

为什么操作不会对列表生效?

(注:我正在使用的列表的实施是ArrayList

更新: 我想删除列表确实存在的对象。我将该类添加到List(因此参数this)并将this(在同一个类中)传递给remove方法。因此,该对象应该存在于列表中(或不?)。

更新: 这是代码。看看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>(); 

    } 


} 

回答

7

如果传入的Object实际上不是在列表中,它不会把名单上的任何影响,因此返回false。

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

+0

另外,如果你使用的是自定义对象在列表中。确保你有overri dden哈希码和等于方法。 – JRR 2013-04-20 12:35:17

0

从这个doc

移除指定元素的第一次出现在此列表, 如果存在的话(可选操作)。如果这个列表不包含 这个元素,它是不变的。更正式地说,删除元素 最低索引i,使得(o == null?get(i)== null: o.equals(get(i)))(如果存在这样的元素)。如果此 列表包含指定的元素(或等效地,如果此列表 因呼叫而更改),则返回true。

2

因为List是一个接口,所以它没有具体的实现例子。但是从ArrayList中服用,它会返回如果:

  • 传递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 
相关问题