listas - lista de objetos java
¿Qué es una lista frente a una lista de arreglos? (6)
Cómo usar List y ArrayList
, u otra implementación de List, es Polymorphism
y Inheritance
, y también la razón por la cual se usan lenguajes como Java.
En simplicidad, el polimorfismo es muchas formas, mientras que la herencia es reutilización.
Puede haber muchos tipos de listas concretas y listas para nosotros que estén disponibles para usted, como ArrayList, Vector
, LinkedList
y Stack
. La decisión de usar la que proviene de usted, y si mira la List , notará que todas estas implementaciones de List se extienden de una forma u otra desde List.
Esta pregunta ya tiene una respuesta aquí:
- Tipo Lista frente a tipo ArrayList en Java 15 respuestas
¿Cuáles son las diferencias fundamentales entre los dos objetos? ¿Es uno más eficiente? ¿Tiene uno más métodos?
Considere una línea como la siguiente:
List<String> names = new ArrayList<String>();
Si es nuevo en las arquitecturas orientadas a objetos, es probable que haya esperado ver algo como ArrayList<String> names = new ArrayList<String>();
. Después de todo, acaba de decir que se trata de una nueva ArrayList
, ¿no debería almacenarla en una variable de tipo ArrayList
?
Bueno, ciertamente puedes hacer eso. Sin embargo, List
es una interfaz, como una especie de plantilla, que se dice que hereda ArrayList
. Es un contrato que dice "cada vez que utilice una implementación de List
, puede esperar que estos métodos estén disponibles". En el caso de List
, los métodos son cosas como add
, get
, etc.
Pero ArrayList
es solo una implementación de List
. Hay otros, como LinkedList
. Los dos tienen la misma interfaz, y se pueden usar de la misma manera, pero funcionan de manera muy diferente detrás de escena. Cuando ArrayList
es un acceso "aleatorio", lo que significa que encuentra directamente un elemento específico de la matriz sin iterar a través de toda la lista, LinkedList
tiene que comenzar desde el primer elemento e ir uno a uno hasta que llegue al elemento que necesita .
El hecho es que, si bien necesita especificar cuál quiere al crear el objeto, generalmente solo necesita comunicar nada más que el hecho de que es una List
, por lo que simplemente dice que es lo que es. List
comunica que tiene una colección que debe estar en el orden en que se entrega. Si no necesita comunicarse tanto, podría considerar pasarlo como una Collection
, que es otra interfaz (una super-interfaz de la List
). O bien, si todo lo que necesita para comunicarse es que puede iterar sobre él, incluso podría llamarlo Iterable
.
De acuerdo con los documentos de Java , List es solo una interfaz, y ArrayList es una de las clases que lo implementan. No existe una ventaja de eficiencia inherente al uso de ArralyList específicamente en lugar de referencias de tipo lista a un objeto ArrayList.
Sin embargo, cuando se trata de "eficiencia", puede haber una diferencia entre las diferentes implementaciones de la interfaz de la Lista. Por ejemplo, puede haber una pequeña diferencia de eficiencia entre LinkedList y ArrayList, dependiendo de cómo los esté usando.
Para citar los documentos de Java en la página ArrayList ,
La operación de adición se ejecuta en tiempo constante amortizado, es decir, agregar n elementos requiere O (n) tiempo. Todas las demás operaciones se ejecutan en tiempo lineal (aproximadamente hablando). El factor constante es bajo comparado con el de la implementación LinkedList.
En otras palabras, la diferencia en el rendimiento probablemente será insignificante, pero es posible que vea alguna ventaja al usar una ArrayList (a diferencia de LinkedList).
En caso de que esté interesado, ArrayList se implementa con una matriz que se redimensiona de vez en cuando (lo más probable es que cada vez que su colección se duplica), que es bastante diferente de la implementación de una Lista Vinculada (consulte la wikipedia para más detalles).
La lista está en la interfaz mientras ArrayList es una clase.
Por ejemplo, no puedes usar esta configuración:
List<String> list = new List<String>();
... Porque es una interfaz.
Sin embargo, esto funciona:
ArrayList<String> arrayList = new ArrayList<String>();
Además ... Puede hacer lo que Duffymo dice a continuación, que es más o menos lo mismo que implementar la interfaz de la List
(hacer su propia implementación de la lista).
List es una interfaz; ArrayList es una clase que implementa la interfaz de lista.
Las interfaces definen las firmas de método que se requieren, pero no dicen nada sobre cómo se implementan.
Las clases que implementan una interfaz prometen proporcionar implementaciones públicas de métodos con las firmas idénticas declaradas por la interfaz.
Una List
define la interfaz que utiliza ArrayList
, que le permite implementar métodos que permitirán que todas las demás clases que implementen List se utilicen juntas o de forma similar. Un ArrayList
siempre es también una List
, pero una List
no es necesariamente una List
ArrayList
.
Es decir, ArrayList
implementa List
(entre algunas otras interfaces).