Stranamente il JDK 6 implementazione predefinita di AbstractList::equals()
non sembra controllare prima se le due liste hanno la stessa dimensione:implementazione JDK di AbstractList :: equals() non controlla la lista uguaglianza misura desiderata
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while(e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
Se entrambi gli elenchi contengono molti articoli o elementi che richiedono tempo per il confronto, li confronteranno tutti prima di rendersi conto che una lista è più corta dell'altra; che mi sembra davvero inefficace in quanto l'uguaglianza potrebbe essere stata fatta senza nemmeno chiamare un confronto.
Soprattutto se per un sacco di situazioni le dimensioni delle liste differiscono la maggior parte delle volte. Inoltre, la maggior parte delle implementazioni Java List
hanno prestazioni O (1) size()
(anche LinkedList, che mantiene le sue dimensioni nella cache).
C'è una buona ragione per questa implementazione predefinita?
Quindi, se a capire bene, è inefficiente perché è stato documentato come tale? :) –
@Laurent Non a causa di "è stato documentato come tale", a causa della decisione di progettazione con il motivo di essere "per alcune sottoclassi il metodo di dimensioni potrebbe essere O (n) e il comportamento richiesto sarebbe in realtà un degrado" :) –
Capisco, ma degrado le prestazioni al primo posto per tutte le implementazioni perché "alcune di esse" potrebbero essere più lente non sembra una buona decisione per me. Avrei creato un uguaglianza ottimizzata per gli elenchi di dimensioni O (1) e non ottimizzato per il resto. Soprattutto per ArrayList che è un cavallo di battaglia in Java ... –