Estructuras de datos .NET:
Más información sobre por qué ArrayList y List son realmente diferentes
Matrices
Como dice un usuario, las matrices son la colección de la "vieja escuela" (sí, las matrices se consideran una colección, aunque no forman parte de System.Collections
). Pero, ¿qué es la "vieja escuela" acerca de las matrices en comparación con otras colecciones, es decir, las que ha enumerado en su título (aquí, ArrayList y List (Of T))? Comencemos con lo básico mirando Arrays.
Para empezar, matrices en Microsoft .NET son "mecanismos que le permiten tratar varios elementos [relacionados lógicamente] como una sola colección" (consulte el artículo vinculado). Qué significa eso? Las matrices almacenan miembros individuales (elementos) secuencialmente, uno tras otro en la memoria con una dirección inicial. Al usar la matriz, podemos acceder fácilmente a los elementos almacenados secuencialmente que comienzan en esa dirección.
Más allá de eso y contrario a la programación de 101 conceptos comunes, las matrices realmente pueden ser bastante complejas:
Las matrices pueden ser de una sola dimensión, multidimensionales o ajustadas (vale la pena leer sobre las matrices irregulares). Las matrices en sí mismas no son dinámicas: una vez inicializadas, una matriz de n tamaño reserva suficiente espacio para contener n cantidad de objetos. El número de elementos en la matriz no puede crecer o reducirse. Dim _array As Int32() = New Int32(100)
reserva suficiente espacio en el bloque de memoria para que la matriz contenga 100 objetos de tipo primitivo Int32 (en este caso, la matriz se inicializa para contener 0). Se devuelve la dirección de este bloque _array
.
Según el artículo, Common Language Specification (CLS) requiere que todas las matrices estén basadas en cero. Las matrices en .NET admiten matrices no basadas en cero; Sin embargo, esto es menos común. Como resultado de la "similitud" de los arreglos basados en cero, Microsoft ha dedicado mucho tiempo a optimizar su rendimiento ; por lo tanto, las matrices de dimensión única, basadas en cero (SZ) son "especiales", y realmente la mejor implementación de una matriz (en oposición a las multidimensionales, etc.), porque las SZ tienen instrucciones específicas de lenguaje intermediario para manipularlas.
Las matrices siempre se pasan por referencia (como una dirección de memoria), una pieza importante del rompecabezas de la matriz para saber. Mientras realizan la verificación de límites (arrojará un error), la verificación de límites también se puede deshabilitar en las matrices.
Nuevamente, el mayor obstáculo para las matrices es que no son redimensionables. Tienen una capacidad "fija". Presentamos ArrayList y List (Of T) a nuestra historia:
ArrayList: lista no genérica
La ArrayList (junto con List(Of T)
, aunque hay algunas diferencias críticas, explicadas más adelante), quizás se considere mejor como la próxima adición a las colecciones (en sentido amplio). ArrayList hereda de la interfaz IList (un descendiente de 'ICollection'). Las ArrayLists, en sí mismas, son más voluminosas (requieren más gastos generales ) que las Listas.
IList
permite la implementación para tratar ArrayLists como listas de tamaño fijo (como Arrays); sin embargo, más allá de la funcionalidad adicional agregada por ArrayLists, no hay ventajas reales al usar ArrayLists que tienen un tamaño fijo ya que ArrayLists (sobre Arrays) en este caso son notablemente más lentas.
De mi lectura, ArrayLists no puede ser irregular: "El uso de matrices multidimensionales como elementos ... no es compatible". De nuevo, otro clavo en el ataúd de ArrayLists. ArrayLists tampoco se "escriben" - lo que significa que, por debajo de todo, un ArrayList es simplemente una matriz dinámica de objetos: Object[]
. Esto requiere una gran cantidad de boxeo (implícito) y unboxing (explícito) al implementar ArrayLists, una vez más agregando a sus gastos generales.
Pensamiento sin fundamento: creo que recuerdo haber leído o haber escuchado de uno de mis profesores que las ArrayLists son una especie de hijo conceptual bastardo del intento de pasar de Arrays a List-type Collections, es decir, aunque una vez han sido una gran mejora para Arrays, ya no son la mejor opción, ya que se ha realizado un mayor desarrollo con respecto a las colecciones
Lista (de T): en qué se convirtió ArrayList (y esperaba ser)
La diferencia en el uso de la memoria es lo suficientemente significativa como para que una Lista (de Int32) consuma un 56% menos de memoria que una ArrayList que contiene el mismo tipo primitivo (8 MB frente a 19 MB en la demostración vinculada del caballero anterior: nuevamente, vinculado aquí ), aunque Este es un resultado compuesto por la máquina de 64 bits. Esta diferencia realmente demuestra dos cosas: primero (1), un "objeto" de tipo Int32 en caja (ArrayList) es mucho más grande que un tipo primitivo Int32 puro (Lista); segundo (2), la diferencia es exponencial como resultado del funcionamiento interno de una máquina de 64 bits.
Entonces, ¿cuál es la diferencia y qué es una Lista (de T) ? MSDN define un List(Of T)
como, "... una lista fuertemente tipada de objetos a los que se puede acceder por índice". La importancia aquí es el bit "fuertemente tipado": una Lista (de T) 'reconoce' los tipos y almacena los objetos como su tipo. Entonces, an Int32
se almacena como un Int32
y no como un Object
tipo. Esto elimina los problemas causados por el boxeo y el desempaquetado.
MSDN especifica que esta diferencia solo entra en juego cuando se almacenan tipos primitivos y no tipos de referencia. Además, la diferencia realmente ocurre a gran escala: más de 500 elementos. Lo que es más interesante es que la documentación de MSDN dice: "Es una ventaja para usted usar la implementación específica de tipo de la clase List (Of T) en lugar de usar la clase ArrayList ..."
Esencialmente, List (Of T) es ArrayList, pero mejor. Es el "equivalente genérico" de ArrayList. Al igual que ArrayList, no se garantiza que se ordene hasta que se ordene (vaya a la figura). La lista (de T) también tiene alguna funcionalidad adicional.