2009-08-17 52 views
6

¿Cuándo debería usar una ArrayList en Java y cuándo debería usar una matriz?¿Cuándo es preferible una ArrayList a una matriz en Java?

+0

duplicado: http://stackoverflow.com/questions/412813/when-to-use-arraylist-over-array –

+0

@ Michael: Creo que este la pregunta tiene respuestas más completas – dfa

+0

@dfa: esto no significa que debamos duplicar las respuestas. La "única forma verdadera" sería actualizar/publicar nuevas respuestas sobre la pregunta original. –

Respuesta

5

ArrayLists son útiles cuando no se conoce de antemano la cantidad de elementos que necesitará. Ejemplo simple: está leyendo un archivo de texto y está compilando una lista de todas las palabras que encuentra. Puede seguir agregando a su lista de matriz, crecerá.

Matrices que necesita declarar previamente su tamaño.

3

Una matriz tiene que declararse con un tamaño fijo, por lo tanto, necesita saber la cantidad de elementos por adelantado.

Una ArrayList es preferible cuando no sabe cuántos elementos necesitará con anticipación, ya que puede crecer como se desee.

Una ArrayList también puede ser preferible si necesita realizar operaciones que están disponibles en su API que requerirían la implementación manual de una matriz. (Por ejemplo, indexOf)

8

Algunas diferencias:

  • matrices son inmutables en su tamaño, no se puede easly quitar y elemento y eliminar el agujero mientras que el uso de un ArrayList es sencillo
  • matrices son rápidos (manejado directamente por la JVM como objetos especiales) que un ArrayList y requiere menos memoria
  • matrices tienen una buena sintaxis para acceder a los elementos (por ejemplo a[i] vs a.get(i))
  • matrices no juegan bien con los genéricos (por ejemplo, se no se puede crear una matriz genérica)
  • Las matrices no se pueden envolver fácilmente como ArrayList (p. Collections utilidades como checkedList, synchronizedList y unmodifiableList)
  • declarando la aplicación ArrayList como List puede intercambiar fácilemte con un LinkedList cuando se necesita; este mi humilde opinión es la mejor ventaja sobre las matrices de civil
  • de toString, equals y hashCode son raros y propenso a errores de matriz, debe utilizar Arrays utilidades clase
+1

¿Por qué usar un ArrayList todo el tiempo? Si tiene situaciones en las que su matriz no necesita expandirse, ¿por qué utilizar ArrayList? ¿O la sobrecarga de ArrayList es insignificante? – pave

+0

En la mayoría de las veces, diría que sí, porque usa una implementación de Array in it. Es más conveniente usar la lista y todas las cosas bonitas que vienen con las colecciones. Si al final tiene problemas de rendimiento, puede ver si la lista realmente es el cuello de botella y eliminarla. – Janusz

+0

Mucho más útil que la capacidad de sustituir LinkedList (que rara vez se necesita) es la capacidad de usar Collections.singletonList() y emptyList(). –

2

Cuando desea cambiar su tamaño mediante la adición o eliminación de elementos.

Cuando quiera pasarlo a algo que quiera una Colección o Iterable (aunque puede usar Arrays.asList (a) para hacer una matriz, a, parecer una Lista).

7

Otro par de puntos:

  • Es posible que desee considerar el uso de una matriz para representar más de una dimensión (matriz por ejemplo).
  • Las matrices se pueden utilizar para almacenar primitivas y, por lo tanto, ofrecen una representación más compacta de sus datos que utilizando un ArrayList.
+0

+1 ambos son puntos muy buenos – dfa

+0

Prefiero tener una matriz representada por una clase real con una interfaz adecuada. Esto podría usar una matriz bidimensional internamente, así que estaría de acuerdo con ese uso, pero no como una interfaz general para representar una matriz. – VoidPointer

+0

@VoidPointer - En general, estoy de acuerdo con usted, aunque depende de cuán intensivo fue el número de operaciones que realicé. – Adamski

2

Yo diría que la presunción predeterminada debería ser usar una lista de arreglos a menos que tenga una necesidad específica, simplemente porque mantiene su código más flexible y menos propenso a errores. No es necesario ampliar el tamaño de declaración cuando agrega un elemento adicional de 500 líneas de código, etc.Y haga referencia a la interfaz de la Lista, de modo que puede reemplazar la lista de Array con una LinkedList o una CopyOnWriteArrayList o cualquier otra implementación de lista que pueda ayudar a una situación sin tener que cambiar una gran cantidad de código.

Dicho esto, las matrices tienen algunas propiedades que usted no obtendrá de una lista. Uno es un tamaño definido con elementos nulos. Esto puede ser útil si no desea mantener las cosas en orden secuencial. Por ejemplo, un juego de tres en raya.

Las matrices pueden ser multidimensionales. ArrayLists no puede.

Las matrices pueden tratar con primitivas, algo que ArrayList no puede (aunque hay clases de colección de terceros que envuelven primitivas, no son parte de la API de colecciones estándar).

+0

Java tiene autoboxing desde Java 5 por lo que puede agregar un int a un objeto ArrayList . – VoidPointer

+0

Eso es cierto, pero no alivia los problemas de rendimiento si tiene una gran variedad de ellos. – Yishai

4

No se trata solo del hecho de que las matrices necesitan crecer, una colección es más fácil de tratar.

A veces las matrices están bien, cuando solo necesita iterar sobre los elementos, solo lectura. Sin embargo, la mayoría de las veces desea utilizar métodos como "contiene", etc.

No puede crear matrices genéricas para que pueda "molestarlo" o no.

En caso de duda, use Colecciones, hará que las personas que usan su API lo aman :-). Si sólo les proporcionan matrices, las primeras líneas de código que van a escribir es:

Arrays.asList(thatGuyArray); 
+0

Arrays.asList no devuelve un java.util.ArrayList pero solo una clase privada que es similar a ArrayList – dfa

+0

sí, soy consciente de ello :-), pero gracias por mencionarlo, podría ser útil para alguien. –

4

La interfaz de lista, de los cuales ArrayList es una implementación en el Java Collections Framework es mucho más rico a continuación, lo que es un conjunto de Java normal tiene ofrecer. Debido al soporte relativamente extendido del marco de recopilación en las bibliotecas de Java y de terceros, usar ArrayList en lugar de una matriz tiene sentido en general. Yo sólo haría uso de matrices de si realmente hay necesidad de ellos:

  • Ellos están obligados por alguna otra interfaz que estoy llamando
  • de perfiles muestra un cuello de botella en una situación en la que el acceso matriz puede producir una aceleración significativa sobre lista de acceso
  • situaciones en las que un conjunto se siente más natural, tales como amortiguadores de datos en bruto como en

    byte[] buffer = new byte[0x400]; // allocate 1k byte buffer 
    

siempre se puede obtener una n matriz representación de su ArrayList si lo necesita:

Foo[] bar = fooList.toArray(new Foo[fooList.size()]) 

Es un patrón de falla común que los métodos devuelven una referencia a un miembro de la matriz privada (campo) de una clase. Esto rompe la encapsulación de la clase cuando los extraños obtienen acceso mutable al estado privado de la clase. En consecuencia, necesitaría siempre clonar la matriz y devolver una referencia a la matriz clonada. Con un ArrayList puede usar ...

return Collections.unmodifiableList(privateListMember); 

... para devolver un envoltorio que protege el objeto de la lista real. Por supuesto, debe asegurarse de que los objetos de la lista también sean inmutables, pero eso también se aplica a una matriz (clonada) de objetos mutables.

De acuerdo con el comentario de Nick Holt, no se debe exponer el hecho de que una lista es un ArrayList en cualquier lugar:

private List<Foo> fooList = new ArrayList<Foo>(); 

public List<Foo> getFooList() { 
    return Collections.unmodifiableList(fooList); 
} 
+1

Agregaría que usted debería depender de java.util.List, que le permite intercambiar la implementación de forma bastante fácil en la mayoría de los casos. –

+0

Buen punto. He agregado eso a la respuesta. – VoidPointer

0

día G,

Un par de puntos que la gente parece haber perdido hasta aquí.

  1. una matriz sólo puede contener un tipo de objeto mientras que un ArrayList es un contenedor que puede contener una mezcla de tipos de objetos, que es heterogénea,
  2. una matriz debe declarar el tipo de su contenido cuando la matriz en sí es declarado. Un ArrayList no tiene que declarar el tipo de su contenido cuando se declara el ArrayList,
  3. debe insertar un elemento en una ubicación específica en un conjunto. Agregar a una ArrayList se realiza mediante el método add() en el contenedor y los objetos
  4. se almacenan en una matriz y conservan su tipo debido a la forma en que la matriz solo puede almacenar objetos de un tipo particular. Los objetos se almacenan en una ArrayList por medio del objeto tipo superclase.

Editar: Ooop. En cuanto al último punto de la lista, olvidé el caso especial en el que tienes una matriz de Objetos, entonces estas matrices también pueden contener cualquier tipo de objeto. Gracias por el comentario, Yishai! (-:

HTH

aplausos,

+1

Si tiene una matriz Object [], puede contener cualquier tipo de Objetos, como una lista de matriz. – Yishai

+0

No creo que ninguno de estos cuatro sea verdadero como está escrito ... –

Cuestiones relacionadas