2012-08-04 20 views
5

¿Se trata internamente como una matriz o el CLR la trata como un tipo totalmente diferente?¿Cómo se mapea internamente la Lista <T>?

Estoy tratando de implementar valores enteros en la lista.

List<int> lst = new List<int>(); 
lst.Add(3); 
lst.Add(4); 

vs

que crear una matriz de enteros

int[] arr = new int[2]; 
arr[0] = 3; 
arr[1] = 4; 

Array Devuelve mejores resultados en tiempo envergadura. Entonces, ¿por qué la gente prefiere List <>.

+2

Puede probar [ILSpy] (http://ilspy.net) y echar un vistazo por su cuenta. La razón para tener una lista dinámicamente cultivable/contraíble es que no es de tamaño fijo como lo es 'Array'. –

Respuesta

5

List<> es una implementación de una estructura de datos, que se encarga de asignar memoria según demanda; permite la inserción y eliminación en cualquier índice, etc. Por lo tanto, es mucho más conveniente que una matriz simple.

Debajo del capó, la implementación actual de List<> usa una matriz para el almacenamiento, y la sobrecarga cuando se realizan operaciones similares a arreglos es mínima. La conveniencia adicional generalmente vale la poca diferencia de rendimiento (si es que es relevante). Agregar elementos suele ser más rápido porque la lista asigna trozos de memoria y no requiere una nueva asignación y copia en cada complemento (en comparación con la matriz pura, donde el Length siempre está vinculado al tamaño en la memoria).

+0

Entonces, lo que está diciendo es, aunque insignificante, 'List <>' proporcionará una respuesta más lenta, en términos de _Speed_, que una 'Array'? –

+2

Por supuesto. La lista es una abstracción de la matriz, y las abstracciones cuestan ciclos de CPU adicionales. Sin embargo, estoy de acuerdo con Lucero, en condiciones normales, List es más que suficientemente rápido. – Steven

+2

El "tiempo de respuesta" es típicamente irrelevante, la solicitud pasa a la matriz subyacente después de una verificación de límites (rápida y barata). Esto probablemente esté incluido en el tiempo de ejecución, por lo que ni siquiera necesita una llamada adicional. – Lucero

1

Una lista de acceso aleatorio normal generalmente tiene una matriz interna. La implementación .NET List<T> hace esto. Otras implementaciones como LinkedList<T> utilizan cadenas de elementos con referencias en lugar de matrices. Las listas más exóticas pueden usar árboles internamente para ordenar.

La matriz interna en List<T> se inicializa con una longitud corta (creo 4), y si intenta agregar fuera de los límites máximos de la matriz, se expande. Como esto puede llevar mucho tiempo (la matriz debe copiarse), la matriz se duplica en tamaño, es decir, cuando agrega el quinto elemento, la matriz interna se redimensiona a la longitud 8, y así sucesivamente.

+0

Recuerdo haber leído que 'List <>' Data Structure está optimizado para _Speed_, mientras que 'Array' DS está optimizado para _Memory_. Parece que estás contradiciendo el hecho de que 'List <>' está optimizado para _Speed_. (cuando decimos que se vuelve a clasificar según el tamaño y reasignado, al moverse fuera de límites) –

+0

No estoy de acuerdo con esa distinción. Una lista TIENE una matriz internamente, por lo que esencialmente no es diferente de una matriz de almacenamiento. Usted paga una pequeña penalización de rendimiento con la lista, y por ese costo obtiene una colección dinámica/de tamaño variable. Entonces, en conclusión, la mayor diferencia entre la lista y la matriz es que siempre se pueden agregar elementos a una lista. –

+1

@bugbuster, si desea agregar un elemento a una matriz (para que 'Length' aumente, es decir, no solo * cambie * un elemento existente), también debe volver a asignar la matriz. La lista crecerá en trozos más grandes y hará un seguimiento de la cantidad de elementos usados ​​de la matriz, por lo que es más rápida para las adiciones secuenciales. – Lucero

Cuestiones relacionadas