por - ejercicios resueltos de colecciones en java
¿Por qué la interfaz de lista extiende la interfaz de colección? (8)
La interfaz de la colección tiene múltiples métodos. La interfaz de lista amplía la interfaz de colección. ¿Declara los mismos métodos que la interfaz de colección? ¿Por qué esto es tan?
Por ejemplo
interface Collection extends Iterable
{
public abstract int size();
public abstract boolean isEmpty();
public abstract boolean contains(java.lang.Object);
public abstract java.util.Iterator<E> iterator();
public abstract java.lang.Object[] toArray();
public abstract <T extends java/lang/Object> T[] toArray(T[]);
public abstract boolean add(E);
public abstract boolean remove(java.lang.Object);
public abstract boolean containsAll(java.util.Collection<?>);
public abstract boolean addAll(java.util.Collection<? extends E>);
public abstract boolean removeAll(java.util.Collection<?>);
public abstract boolean retainAll(java.util.Collection<?>);
public abstract void clear();
public abstract boolean equals(java.lang.Object);
public abstract int hashCode();
}
y los mismos métodos también están presentes en la interfaz de la Lista:
public interface List extends Collection
{
public abstract int size();
public abstract boolean isEmpty();
public abstract boolean contains(java.lang.Object);
public abstract java.util.Iterator<E> iterator();
public abstract java.lang.Object[] toArray();
public abstract <T extends java/lang/Object> T[] toArray(T[]);
public abstract boolean add(E);
public abstract boolean remove(java.lang.Object);
public abstract boolean containsAll(java.util.Collection<?>);
public abstract boolean addAll(java.util.Collection<? extends E>);
public abstract boolean removeAll(java.util.Collection<?>);
public abstract boolean retainAll(java.util.Collection<?>);
public abstract void clear();
public abstract boolean equals(java.lang.Object);
public abstract int hashCode();
}
¿Es un requisito volver a escribir estos métodos en la Lista si ya está extendiendo la interfaz de la Colección?
En primer lugar, la lista de la lista hereda todos los métodos de la Colección, por lo que todos los métodos que existen en la interfaz de la Colección también existirán en la interfaz de la Lista, pero la interfaz de la Lista tiene métodos adicionales (verifíquelo usted mismo) que describe el comportamiento de la lista
Es principalmente debido a la finalidad de la documentación que han utilizado de esa manera.
Por ejemplo
Collection#retainAll
Retiene solo los elementos de esta colección que están contenidos en la colección especificada (operación opcional).
List#retainAll
Retiene solo los elementos en esta lista que están contenidos en la colección especificada (operación opcional).
Sólo para el propósito de la documentación de Java se han utilizado de esa manera. Pero algunos de los métodos de comportamiento en sí cambiaron
For ex.add,remove
Método quitar
In List, Removes the first occurrence of the specified element from this list, if it is present (optional operation).
In Collection , Removes a single instance of the specified element from this collection, if it is present (optional operation).
A través de Java doc han indicado claramente que se ordenan las implementaciones de la Lista.
Las firmas en los métodos toArray
sugieren que extrajo esto de los archivos .class
compilados. El formato del archivo de clase especifica que el archivo .class
no repite los métodos heredados de las superinterfaces, por lo que sospecho que cualquier herramienta que usó para obtenerlos le mostró una vista compuesta; Los métodos no están realmente presentes físicamente en la List
.
Los contratos de JavaDoc y API cambian un poco o se vuelven más específicos a medida que se mueve hacia abajo en la jerarquía de herencia.
La lista vuelve a declarar estos métodos y les da un JavaDoc más específico.
Se reescriben para que puedan documentarse, a fin de especificar cómo la Lista refina el contrato de estos métodos en comparación con el contrato especificado en la interfaz de la Colección.
Por ejemplo, el método add()
en la List
se documenta para especificar que el elemento se agrega al final de la lista. Esto no se puede especificar en Colección, ya que una Colección no tiene un principio y un final.
Una colección es sólo una colección de artículos.
Una lista, además de mantener una lista de elementos, le agrega información sobre la secuencia de cosas.
Cuando agrega un elemento a la colección, simplemente lo agrega. Cuando agrega un elemento a la Lista, puede agregarlo en la posición n
Cuando eliminas un artículo de la colección, simplemente lo estás eliminando. Cuando elimina un elemento de la Lista, puede eliminar en la posición n
Cuando quieres obtener un artículo de la colección, debes iterar. Cuando desee obtener un artículo de la Lista, puede obtener la posición n
Collection<T>
es solo un grupo de elementos. En sí mismo, no tiene más requisitos que mantener referencias a los muchos elementos que son sus miembros.
En la api java básica hay dos tipos principales de colecciones: List<T>
y Set<T>
.
List<T>
tiene el requisito adicional de mantener un cierto orden (orden de inserción, orden ordenado, ...) para todos sus artículos. De modo que si solicita el artículo N, la lista siempre devolverá el mismo artículo para N.
Set<T>
no ofrece ninguna garantía de pedido, pero ofrece garantía sobre la exclusividad de los artículos. Un artículo A no se puede agregar dos veces a un Conjunto, o aparecerá solo una vez en un conjunto.
Debería familiarizarse con la práctica de la interfaz de "marcador". Serializable
es uno de esos, y generalmente el ejemplo básico cuando se habla de esto. Y la List<T>
y el Set<T>
se declaran como tales, marcan una colección como una u otra para informar al programador del comportamiento que pueden esperar de la colección que reciben.
Consulte el Artículo 37 (Capítulo 6) de "Eficaz Java" para obtener una buena explicación de cómo esto es mejor que usar anotaciones.
Y también está el hecho de que myCollection instanceof MyInterface
es más rápido que myCollection.getClass().isAnnotationPresent(MyAnnotation.class)
o myCollection.getClass().getAnnotation(MyAnnotation.class) != null
.
Sólo por conveniencia.
La interfaz de la Lista coloca estipulaciones adicionales, más allá de las especificadas en la interfaz de la Colección, en los contratos del iterador, métodos de agregar, eliminar, iguales y hashCode. Las declaraciones de otros métodos heredados también se incluyen aquí para mayor comodidad.