¿Cuánto cuesta llamar a size() en List o Map en Java? o es mejor guardar el valor de size() en una variable si se accede con frecuencia?¿Qué tan caro es el tamaño de llamada() en Lista o Mapa en Java?
Respuesta
La respuesta es que depende de la clase de implementación real. Para algunas clases Map
y Collection
, size()
es una operación económica de tiempo constante. Para otros, puede implicar contar los miembros.
El
Java Collections Cheatsheet (V2) es normalmente una buena fuente para este tipo de información, pero el servidor host está actualmente un poco enfermo.
El dominio "coderfriendly.com" ya no existe, pero rastreé una copia de the cheat-sheet en scribd.com.
El costo de size()
también será obvio al mirar el código fuente. (Y esto es un "detalle de implementación" que está casi seguro de no cambiar ... para las clases de colección estándar.)
FOLLOWUP
Por desgracia, la única cheatsheet documenta la complejidad de size
para la cola implementaciones.Creo que es porque es O(1)
para todas las demás colecciones; ver la respuesta de @seriesizer
+1 para todo, pero me gustaría dar un +1 adicional para el Cheatsheet Collections (es realmente genial) –
Su enlace me está llevando por todos lados. – DeathByTensors
@DrewBuckley - corregido. Para el registro, eso es lo que sucede con los nombres de dominio que se "parquean". –
para ArrayList
la puesta en práctica es como
public int size() {
return lastIndex - firstIndex;
}
Así no sobre la cabeza
Puede comprobar el código fuente para obtener información detallada requerida para su Impl.
Nota: La fuente dada es de OpenJDK
En mi ArrayList versión 1.56 ya lo obtiene de un atributo privado de tamaño int. – Manny
@Manny Esta es la fuente de OpenJDK –
Usted no tiene que preocuparse mucho acerca de eso. Las implementaciones de lista realizan un seguimiento del tamaño. El costo de la llamada es solo O (1). Si tiene mucha curiosidad, puede leer el código fuente de las implementaciones de las clases concretas de Collection y ver allí el método de size().
IMO, ¿debería preocuparse por eso (en general), el algoritmo del pintor Schlemiel? – Ishtar
La implementación la obtiene de una variable precomputada privada, por lo que no es cara.
Impleméntelo, luego pruébelo. Si es lento, échale un vistazo más de cerca.
"La optimización prematura es la raíz de todo mal". - D. Knuth
También: No debe requerir ciertas características de implementación, especialmente si están enmarcadas. ¿Qué sucede si reemplaza esa lista con una lista concurrente en una fecha posterior? ¿Qué sucede si Oracle decide reescribir List? ¿Seguirá siendo rápido? Usted simplemente no sabe.
Es * Optimización prematura *. Knuth es estadounidense :-) –
* "¿Qué sucede si Oracle decide reescribir List?" * (Nitpick: presumiblemente se refiere a una clase de implementación de listas). Una reescritura que hiciera 'size' una operación' O (N) 'rompería un gran número de aplicaciones. Oracle estaría loco por hacer esto. Es casi tan probable que ocurra como Microsoft con código abierto de Windows. (Menos probable en realidad ...) –
@Stephen C: Tiene toda la razón, Oracle sería una locura cambiar el comportamiento de Size() en ArrayList en esta fecha (y aún así apostaría que tales cambios han sucedido en todos los principales bibliotecas de idiomas en algún momento). Es/probablemente/no relevante en este ejemplo específico. El principal problema es un reemplazo posterior de la implementación, desde ArrayList hasta ConcurrentList, alguna Lista de terceros o lo que sea. –
Creo que algunas implementaciones de LinkedList cuentan el total de cada llamada. La llamada a un método en sí puede ser un poco exigente, pero solo si estamos hablando de grandes iteraciones o códigos de controladores para hardware, realmente sería un problema.
En cualquier caso, si lo guarda en una variable local, no habrá ningún problema.
List
y Map
son interfaces, por lo que es imposible de decir. Para las implementaciones en la API estándar de Java, el tamaño generalmente se mantiene en un campo y, por lo tanto, no es relevante para el rendimiento.
Para la mayoría de las colecciones, llamar al size()
es una operación de tiempo constante. Sin embargo, hay algunas excepciones. Uno es ConcurrentLinkedQueue. Desde el Javadoc de the size() method:
Tenga en cuenta que, a diferencia de la mayoría de las colecciones, este método NO es una operación de tiempo constante. Debido a la naturaleza asíncrona de estas colas, determinar el número actual de elementos requiere un recorrido O (n).
Así que me temo que no hay una respuesta genérica, debe verificar la documentación de la colección individual que está utilizando.
- 1. ¿Qué tan caro es .getClass() en Java?
- 2. ¿Qué tan caro es Thread.getStackTrace()?
- 3. ¿Qué tan caro es recargableData de UITableView?
- 4. ¿Qué tan caro es el tiempo de llamada (NULL) en el bucle del servidor?
- 5. ¿Qué tan "caro" es Oracle Enterprise Manager?
- 6. ¿Qué tan caro es lanzar un objeto?
- 7. ¿Qué tan caro es el estado de bloqueo?
- 8. ¿Qué tan caro es el volcado de hilos de Java (Solr)?
- 9. ¿Qué tan caro es leer las propiedades del archivo? .NET
- 10. Python: ¿Qué tan caro es crear una pequeña lista muchas veces?
- 11. ¿Por qué DateTime.Now DateTime.UtcNow tan lento/caro?
- 12. ¿Qué tan 'caro' es ejecutar jstack en una JVM en ejecución?
- 13. ¿Qué tan caro es crear un nuevo hilo en Java? ¿Cuándo deberíamos considerar el uso de un grupo de subprocesos?
- 14. ¿Qué tan seguro es el thread enum en java?
- 15. ¿Qué tan caro es realizar una operación de lanzamiento Vs i ++?
- 16. Lista vs Mapa en Java
- 17. ¿Qué tan caro es la creación de instancias de CloudStorageAccount o CloudBlobClient desde el punto de vista del rendimiento?
- 18. ¿Qué es la llamada Collections.checkedList() en java?
- 19. ¿Es class.getName() caro?
- 20. ¿Cuándo es el tamaño de la llamada a la base de datos más caro que la frecuencia de las llamadas?
- 21. Esperando un evento en Java: ¿qué tan difícil es?
- 22. ¿Es caro el uso de atributos en .Net (C#)?
- 23. Qué tan popular es el Seam Framework
- 24. ¿Qué tan grande es una referencia de objeto en Java y, precisamente, qué información contiene?
- 25. javascript/dom - ¿Qué tan caro es crear vs reorganizar nodos dom?
- 26. ¿Qué tan estable es el lenguaje Groovy?
- 27. ¿Qué tan caro es comparar dos conjuntos desordenados para la igualdad?
- 28. ¿Es "IF" caro?
- 29. ¿Por qué mi llamada mongodb es tan lenta?
- 30. ¿Qué tan único es XAML?
+1 nice qn Niru – abi1964