2011-07-29 15 views
19

¿Cuáles son las diferencias fundamentales entre los dos objetos? ¿Es uno más eficiente? ¿Tiene uno más métodos?¿Qué es una lista frente a una lista de arreglos?

+6

¡Dios mío, * esto * nunca se ha pedido antes! Para el OP, considere buscar en el foro primero antes de preguntar. –

+0

@Hovercraft, ¿está seguro de que nunca se lo preguntaron antes? – Atreys

+5

Votación para volver a abrir: no creo que la publicación vinculada sea un duplicado. Se trata de codificar a la interfaz frente a la implementación, mientras que en realidad se está preguntando cuál es la diferencia entre 'List' y' ArrayList'. –

Respuesta

23

La lista está en la interfaz mientras ArrayList es una clase.

Ver ArrayList y List.

por ejemplo, no se puede usar esta configuración:

List<String> list = new List<String>(); ... Debido a que es una interfaz.

Sin embargo, esto funciona:

ArrayList<String> arrayList = new ArrayList<String>();

también ... Se puede hacer como duffymo dice a continuación, que es más o menos lo mismo que implementar la interfaz List (hacer su propia implementación de la lista).

+3

No, pero puede hacer esto: List list = new List () {// implementamos todos los métodos de lista aquí.}; – duffymo

2

A List define la interfaz que usa 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 un List, pero un List no es necesariamente un ArrayList.

Es decir, ArrayList implementa List (entre algunas otras interfaces).

13

La lista 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.

-1

De acuerdo con java docs, 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 el docs java en la página ArrayList,

La operación de adición se ejecuta en tiempo constante amortizado, es decir, la adición de n elementos requiere tiempo O (n). 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 algunas ventajas al utilizar un ArrayList (en lugar de una lista vinculada).

En caso de que le interese, ArrayList se implementa con una matriz que se redimensiona de vez en cuando (muy probablemente cada vez que la colección se duplica), lo cual es bastante diferente de la implementación de una LinkedList (ver wikipedia para más detalles)

+1

Él no es. Él está preguntando cuándo debería usar List y cuándo debería usar ArrayList. LinkedList no entra - como todas las respuestas anteriores pudieron haber indicado. LinkedList es una dirección equivocada para esta pregunta en particular. – RichieHH

16

Considérese una línea como la siguiente:

List<String> names = new ArrayList<String>(); 

Si eres nuevas arquitecturas orientadas a objetos a, que podría haber esperado en lugar de ver algo así como ArrayList<String> names = new ArrayList<String>();. Después de todo, ¿acaba de decir que es un nuevo ArrayList, por lo que no debería almacenarlo en una variable del tipo ArrayList?

Bueno, ciertamente puedes hacer eso. Sin embargo, List es una interfaz, como una especie de plantilla, que se dice que ArrayList hereda. Es un contrato que dice "cada vez que utilice una implementación 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 sólo una aplicació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. Donde 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 List, por lo que simplemente dice que es eso. List comunica que tiene una colección que está destinada a estar en el orden en que se entrega. Si no necesita comunicarse mucho, puede considerar pasarlo como Collection, que es otra interfaz (una super-interfaz de List). O bien, si todo lo que necesita para comunicarse es que puede iterar sobre él, incluso podría llamarlo Iterable.

1

Cómo usar List y ArrayList, u otra implementación de List, es Polymorphism y Inheritance, y también el motivo por el que se utilizan idiomas como Java.

En simplicidad, el polimorfismo es muchas formas, mientras que la herencia es la reutilización.

Puede haber muchos tipos de concreto y Listas listas para usted, como ArrayList, Vector, LinkedList y Stack. La decisión de usar la que proviene de usted, y si mira el List API, notará que todas estas implementaciones de listas se extienden de una forma u otra desde List.

Cuestiones relacionadas