为什么要列清单?添加并列出< >将元素复制到新数组中,而不是实际添加和删除

本文关键字:添加 数组 删除 复制 为什么 元素 新数组 | 更新日期: 2023-09-27 18:06:25

我正在查看ReferenceSource中的List<T>,发现List<T>.Add(也是RemoveRemoveAt)实际上将内部列表数组(T[] _items)复制到具有新修改的新数组中;它们实际上调用Array.Copy方法,它调用clr内部方法Copy。我不知道内部方法(Copy)是如何工作的,但如果它被称为(复制),那么我相信这将是一个性能昂贵的方式来添加项目或从列表中删除项目;我想知道为什么没有实际的添加和删除?

为什么要列清单?添加并列出< >将元素复制到新数组中,而不是实际添加和删除

Add方法并不总是复制内部数组。当数组被元素填满时,它的元素被移动到一个新的数组中,大小是原来的两倍。

Remove而言。可以看到,只有当index小于_size时,它才会执行复制操作。这意味着,如果您试图从列表中删除最后一个元素,则不需要调整内部数组的大小,只需删除最后一个元素即可。然而,如果你想从中间删除一个元素,你需要创建"shift",在被删除的索引后面的元素左移。

这就是为什么如果您要从List<T>的任意索引中删除许多元素,那么建议使用另一种数据结构,例如LinkedList