2011-01-30 18 views
14

Duplicar posibles:
Benefits of arrays¿Hay razones para preferir matrices sobre ArrayLists?

Hola,

¿Hay alguna razón para preferir Arrays (MyObject[]) sobre ArrayLists (List<MyObject>)? El único lugar que queda para usar Arrays es para tipos de datos primitivos (int, boolean, etc.). Sin embargo, no tengo una explicación razonable para esto, simplemente hace que el código sea un poco más delgado.

En general uso List para mantener una mejor flexibilidad. ¿Pero quedan razones para usar matrices reales?

Me gustaría saber, mejores deseos

+1

posible duplicado de [Beneficios de matrices] (http://stackoverflow.com/questions/2843928/benefits-of-arrays). En general, ya encontrarás muchas preguntas sobre ArrayList vs Array aquí. –

+0

¿por qué no unir y eliminar este? – bestsss

Respuesta

1

Generalmente matrices tienen sus problemas, por ejemplo, tipo seguridad:

Integer[] ints = new Integer[10]; 
Number[] nums = ints; //that shouldn't be allowed 
nums[3] = Double.valueOf[3.14]; //Ouch! 

No juegan bien con las colecciones, tampoco. Así que, por lo general, debería preferir las Colecciones sobre las matrices. Hay algunas cosas donde las matrices pueden ser más convenientes. Como ya dijiste, los tipos primitivos serían una razón (aunque podrías considerar el uso de libs similares a colecciones como Trove). Si la matriz está oculta en un objeto y no necesita cambiar su tamaño, está bien utilizar matrices, especialmente si necesita todo el rendimiento que pueda obtener (digamos Vectores 3D y 4D y Matrices para gráficos 3D). Otra razón para usar matrices puede ser si su API tiene muchos métodos varargs.

Por cierto: hay un truco lindo que usa una matriz si usted necesita las variables mutables para las clases anónimas:

public void f() { 
    final int[] a = new int[1]; 
    new Thread(new Runnable() { 
     public void run() { 
     while(true) { 
      System.out.println(a[0]++); 
     } 
     }  
    }).start(); 
} 

Tenga en cuenta que no se puede hacer esto con una variable int, ya que debe ser definitiva.

0

uno para usted:

clasificación de la lista (a través de j.u.Collections) se transforman primero en [], a continuación, ordenados (que clona el [] una vez más para la combinación de tipo) y luego poner de nuevo a la lista. Usted entiende que ArrayList tiene un objeto de respaldo [] debajo de la cubierta.

En la época en que había un caso ArrayList.get no estaba incluido en el compilador del punto de acceso del cliente, pero ahora creo que está solucionado. Por lo tanto, el problema de rendimiento con ArrayList en comparación con Object [] no es tan difícil, el caso arrojado al tipo apropiado aún cuesta unos pocos relojes (pero debe ser el 99,99% de los tiempos previstos por la CPU); el acceso a los elementos de ArrayList puede costar un caché más, y más (o el primer acceso en su mayoría)

Así que depende de lo que haga con su código al final.

Editar Olvidé que puede tener atómica acceso a los elementos de la matriz (es decir CAS cosas), uno impl es j.u.c.atomic.AtomicReferenceArray. No es el más práctico ya que no permite CAS of Objec [] [] pero Unsafe viene al rescate.

0

Creo que la diferencia principal de una matriz y una lista es que una matriz tiene una longitud fija. Una vez que está lleno, está lleno. ArrayLists tiene una longitud flexible y utiliza matrices para ser implementadas.Cuando el arrayList está fuera de su capacidad, los datos se copian a otro conjunto con una capacidad mayor (eso es lo que me enseñaron una vez).

Todavía se puede usar una matriz, si tiene la longitud de datos corregida. Debido a que las matrices son bastante primitivas, no tienen muchos métodos para llamar y todo. La ventaja de usar estas matrices ya no es tan grande, porque las listas de matrices son simplemente buenos envoltorios para lo que se desea en Java o en cualquier otro idioma.

Creo que incluso puede establecer una capacidad fija para las listas de arreglos hoy en día, por lo que incluso esa ventaja se derrumba.

¿Hay alguna razón para preferirlos? Probablemente no, pero sí se asegura de que tenga un poco más de espacio en la memoria, debido a la funcionalidad básica. La lista de arrays es una envoltura bastante grande y tiene mucha flexibilidad, lo que no siempre deseas.

+0

> "El arraylist es un envoltorio bastante grande y tiene mucha flexibilidad, lo que no siempre quieres.? bestsss

+0

@bestsss ArrayLists crea matrices que tienen capacidad extra Así que sí, hay espacio extra utilizado, que tal vez no era necesario en primer lugar. Dependiendo del tipo de objetos que coloque en el arraylist, el arraylist se hace más grande por la capacidad extra. – Marnix

+0

> Dependiendo del tipo de objetos que coloque en el arraylist, el arraylist se hace más grande por la capacidad adicional bestsss

8

Prefiero usar Array s sobre ArrayList s cuando sé que solo voy a trabajar con un número fijo de elementos. Mis razones son principalmente subjetiva, pero los estoy enumerando aquí de todos modos:

  1. Usando Collection clases de primitivas es apreciablemente más lenta ya que tienen que utilizar autoboxing y envolturas.

  2. Prefiero la sintaxis [] más directa para acceder a elementos sobre ArrayList 's get(). Esto realmente se vuelve más importante cuando necesito arreglos multidimensionales.

  3. ArrayList s suelen asignar aproximadamente el doble de la memoria que necesita ahora de antemano para que pueda agregar elementos muy rápido. Entonces hay desperdicio si nunca agregará más artículos.

  4. (Posiblemente relacionado con el punto anterior) Creo que los accesos ArrayList son más lentos que los arreglos simples en general. La implementación ArrayList utiliza una matriz subyacente, pero todos los accesos deben pasar por los métodos get(), set(), remove(), etc., lo que significa que pasa por más código que un simple acceso a la matriz. Pero en realidad no he probado la diferencia, así que puedo estar equivocado.

Habiendo dicho eso, creo que la elección en realidad depende de para qué lo necesite. Si necesita una cantidad fija de elementos o si va a usar múltiples dimensiones, sugeriría una matriz simple. Pero si necesita una lista de acceso aleatorio simple y va a hacer muchas inserciones y eliminaciones en ella, tiene mucho más sentido utilizar un Arraylist

Cuestiones relacionadas