En mi opinión, List
se implementa básicamente utilizando LinkedList
, mientras que un Array
normal se implementa como bloques contiguos. Siempre utilicé List
porque está en el espacio de nombres Generic
y porque pensé que usaba asignación de memoria dinámica - pero estaba equivocado.¿Por qué SortedList y List usan array y por qué LinkedList no se usa mucho?
Ayer vi la implementación de List
usando Reflector y encontré que en realidad es una matriz de T (T[]
). Hay muchos Array.Copy
alrededor al manipular cada elemento en el List
. Por ejemplo, cuando usa Insert
, creará una nueva memoria y copiará todos los elementos antes/después de los elementos insertados. Entonces me parece que el uso de List
es muy caro.
Vi el SortedList
también. No estoy seguro de por qué un SortedList
también implementa una matriz dentro de él. ¿No cree que SortedList
sería horrible utilizar una matriz, ya que necesita ordenar la lista cada vez que se produce una manipulación menor en el List
?
También me pregunto por qué List
es tan popular como la mayoría de la gente lo usa en lugar de ir por LinkedList
. ¿Es solo por la flexibilidad del indexador?
Mire de cerca: Lista <> no * crea una nueva matriz y copia todos los elementos en * cada * llamada. La matriz solo se redimensiona cuando está llena y se redimensiona al doble de su tamaño original. El redimensionamiento se produce solo a intervalos exponencialmente crecientes cuando se agregan elementos continuamente. – dtb
No hay una respuesta correcta a esta pregunta. Piense en ser más específico o marque como wiki –
@dtb sí, usa this._items [this._size ++] = item; Sí, aumenta exponencialmente los intervalos, pero ¿cómo garantiza siempre que el tamaño ++ tenga un espacio vacío? – abhishek