Cuándo y por qué List remove (Object object) devuelve false

¿Cuándo y por qué el método boolean java.util.List.remove(Object object)devuelve falso?

La documentación declara

[El método devuelve] verdadero si esta lista fue modificada por esta operación, falso de lo contrario.

¿Por qué la operación no tendría efecto en la Lista?

(Nota: la implementación de la Lista que estoy utilizando es la ArrayList)

Actualización: Los objetos que estoy tratando de eliminar existen en la Lista. Agrego la clase al List(de ahí el argumento this) y paso this(dentro de la misma clase) al método remove. Por lo tanto, el objeto debe existir en la Lista (¿o no?).

Actualización: Aquí está el código. Echa un vistazo al delay()método. Ahí es donde intento eliminar la clase respectiva de 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>();

    }


}
Respuesta 1

Si el Objectpasado no está realmente en la lista, no tendría ningún efecto en la lista y, por lo tanto, devolvería falso.

Editar (gracias Jai): el método utiliza el método específico Objects equals()para determinar si contiene ese objeto. Por lo tanto, si tiene objetos personalizados, asegúrese de anular el equals()método y también el hashCode()(para mantener el contrato general entre los métodos).

Respuesta: 2

Como List es una interfaz, no tendría una implementación concreta como ejemplo. Pero tomando de ArrayList, devolverá falso si:

  • pasa nulo y no hay ningún objeto nulo en la lista, o
  • pasa un objeto que no se encuentra en la lista

De 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;
     }

Agregar el código de fastRemove, para completar:

 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
  }

Probándolo:

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()));
}

Resultado:

Removing null on empty list: false
Removing an object that won't be found: false
Respuesta: 3

Necesitamos perfilar las operaciones JDBC de varias aplicaciones web, número de consultas, tiempo dedicado, filas devueltas, ... ¿Ha utilizado alguna herramienta de creación de perfiles JDBC gratuita / comercial? Cuales son tus experiencias ...

En el compilador de Java Hotspot, ¿cuál es la diferencia entre inicializar Java con -client en lugar de -server, y cuáles son los pros / contras / advertencias de cada uno?

Tengo una lista de objetos Java en mi servidor que se envía al cliente a través de algún mecanismo de serialización. De vez en cuando, la Lista de objetos se actualiza en el servidor, es decir, algunos objetos se ...

Tengo la necesidad de serializar un objeto Area (java.awt.geom.Area) en un socket. Sin embargo, no parece ser serializable. ¿Hay alguna manera de hacer tal cosa? Quizás convirtiéndolo en un ...