¿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?
Respuesta
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.
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)
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]
vsa.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
yunmodifiableList
) - declarando la aplicación
ArrayList
comoList
puede intercambiar fácilemte con unLinkedList
cuando se necesita; este mi humilde opinión es la mejor ventaja sobre las matrices de civil - de
toString
,equals
yhashCode
son raros y propenso a errores de matriz, debe utilizar Arrays utilidades clase
¿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
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
Mucho más útil que la capacidad de sustituir LinkedList (que rara vez se necesita) es la capacidad de usar Collections.singletonList() y emptyList(). –
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).
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.
+1 ambos son puntos muy buenos – dfa
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
@VoidPointer - En general, estoy de acuerdo con usted, aunque depende de cuán intensivo fue el número de operaciones que realicé. – Adamski
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).
Java tiene autoboxing desde Java 5 por lo que puede agregar un int a un objeto ArrayList
Eso es cierto, pero no alivia los problemas de rendimiento si tiene una gran variedad de ellos. – Yishai
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);
Arrays.asList no devuelve un java.util.ArrayList pero solo una clase privada que es similar a ArrayList – dfa
sí, soy consciente de ello :-), pero gracias por mencionarlo, podría ser útil para alguien. –
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);
}
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. –
Buen punto. He agregado eso a la respuesta. – VoidPointer
día G,
Un par de puntos que la gente parece haber perdido hasta aquí.
- 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,
- 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,
- 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
- 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,
Si tiene una matriz Object [], puede contener cualquier tipo de Objetos, como una lista de matriz. – Yishai
No creo que ninguno de estos cuatro sea verdadero como está escrito ... –
- 1. Asignación de una matriz a una ArrayList en Java
- 2. ¿Cómo puedo cortar una ArrayList de una ArrayList en Java?
- 3. Java: ordenar una ArrayList en su lugar
- 4. Conversión de una ArrayList en una matriz 2D
- 5. ¿Cuándo es preferible AtomicInteger en lugar de sincronizado?
- 6. ¿Es preferible CakePHP para una aplicación web a gran escala?
- 7. ¿Cuándo es preferible usar booleano volátil en Java en lugar de AtomicBoolean?
- 8. ¿Mockito es preferible a EasyMock?
- 9. Java convertir ArrayList en cadena y volver a ArrayList?
- 10. ¿Cómo crear una ArrayList desde una matriz en PowerShell?
- 11. Convierte una doble matriz para doblar ArrayList
- 12. ¿Por qué es preferible utilizar listas en lugar de matrices en Java?
- 13. ¿Cómo convertir ArrayList a una matriz de estructura?
- 14. ¿Cuándo preferir una lista varargs a una matriz?
- 15. Java - ¿Es posible ArrayList <Integer> [] []?
- 16. Java: matriz bidimensional con métodos/capacidades similares a ArrayList
- 17. Cuando abort() es preferible a exit()?
- 18. ¿Cuándo es apropiado usar una matriz de celdas frente a una estructura en Matlab?
- 19. Java - quitar último punto conocido debido a una ArrayList
- 20. ¿Cuándo es mejor usar un vector que una matriz y viceversa en Java?
- 21. ArrayList en Java y entrada
- 22. Java ArrayList of Arrays?
- 23. crear una ArrayList de bytes
- 24. Enum.values () vs EnumSet.allOf(). ¿Cuál es más preferible?
- 25. Convertir matriz de cadenas arrayList
- 26. ¿Qué es una matriz dentada?
- 27. ¿Cómo se configuran los valores de una matriz a los valores de otra matriz en Java?
- 28. búsqueda en java ArrayList
- 29. Cuándo [pantallas UIScreen] devolvería una matriz vacía
- 30. ¿Qué tipo de herencia es más preferible?
duplicado: http://stackoverflow.com/questions/412813/when-to-use-arraylist-over-array –
@ Michael: Creo que este la pregunta tiene respuestas más completas – dfa
@dfa: esto no significa que debamos duplicar las respuestas. La "única forma verdadera" sería actualizar/publicar nuevas respuestas sobre la pregunta original. –