Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用什么数据结构来实现arraylist_C#_Data Structures_Arraylist - Fatal编程技术网

C# 使用什么数据结构来实现arraylist

C# 使用什么数据结构来实现arraylist,c#,data-structures,arraylist,C#,Data Structures,Arraylist,构建arraylist时使用的是什么数据结构,因为我们可以在arraylist上动态添加/删除值 我假设它使用linkedlist,但在做了一些google之后,我发现它使用vector。。但是没有更多的细节。Arraylist在内部使用数组存储数据,并在需要时调整数组大小 Arraylist的java实现在内部创建具有初始大小的数组并调整数组大小 您可以在此处看到实现: 这适用于Java,但概念与.NET相同。来自: 使用一个数组实现IList接口,该数组的大小根据需要动态增加 直接使用类而

构建arraylist时使用的是什么数据结构,因为我们可以在arraylist上动态添加/删除值


我假设它使用linkedlist,但在做了一些google之后,我发现它使用vector。。但是没有更多的细节。

Arraylist在内部使用数组存储数据,并在需要时调整数组大小

Arraylist的java实现在内部创建具有初始大小的数组并调整数组大小

您可以在此处看到实现:

这适用于Java,但概念与.NET相同。

来自:

使用一个数组实现IList接口,该数组的大小根据需要动态增加

直接使用类而不是数组的一些好处是:

  • 它可以在IList的任何位置使用
  • 当从数组中间添加/删除项时,它为您处理大小调整和复制
  • 它跟踪数组中的“最后”项
  • 它提供了对数组中的项进行二进制搜索的方法

ArrayList将值作为对象数组在内部存储,并公开一些公共帮助器方法,以使使用数组更容易(通过
IList
界面公开)

插入项目时,插入点右侧的所有元素都会向右移动,这使得插入效率非常低。另一方面,追加很快,因为不需要移动元素(除非内部阵列已达到容量,在这种情况下,它将替换为更大的阵列)

由于这些值在内部存储为数组,因此它提供了数组的优点(例如,如果对值进行排序,则可以进行高效搜索)。

请参见此处:

如前所述,它下面是一个数组

private object[] _items;
下面是Add()方法:

如您所见,EnsureCapacity被调用…最终调用set_Capacity:

public virtual void set_Capacity(int value)
{
    if (value < this._size)
    {
        throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("ArgumentOutOfRange_SmallCapacity"));
    }
    if (value != this._items.Length)
    {
        if (value <= 0)
        {
            this._items = new object[4];
            goto IL_65;
        }
        object[] array = new object[value];
        if (this._size > 0)
        {
            Array.Copy(this._items, 0, array, 0, this._size);
        }
        this._items = array;
        return;
    }
    IL_65:
}
公共虚拟空集容量(int值)
{
如果(值<此大小)
{
抛出新ArgumentOutOfRangeException(“value”,Environment.GetResourceString(“ArgumentOutOfRange_SmallCapacity”);
}
if(值!=此._items.Length)
{
如果(值为0)
{
复制(此._项,0,数组,0,此._大小);
}
这个。_items=数组;
返回;
}
IL_65:
}

如果需要增加容量,则将整个阵列复制到更大的阵列。

在现代处理器上,内存缓存是最重要的。高效地使用缓存会产生巨大的差异,当程序访问内容未缓存的地址时,处理器很容易停滞数百个周期,等待非常慢的内存总线提供数据

按顺序访问内存时,访问内存的效率最高。一个字节在缓存中可用的几率最大,它很可能出现在同一缓存线中。这使得数组成为迄今为止最有效的集合对象,假设您按顺序索引数组元素

因此,除LinkedList之外的所有.NET集合类都使用数组来存储数据。包括哈希集合(哈希表、字典、哈希集),它们使用数组数组。包括ArrayList。LinkedList应该避免使用,因为它的缓存位置非常差,除非在随机已知位置进行廉价的插入和删除是主要问题

数组的一个问题是它们的大小是固定的,这使得很难实现自动调整集合大小,如ArrayList。这是通过故意浪费地址空间来解决的。每当阵列充满容量时,就会重新分配阵列并复制元素。重新分配是以前大小的两倍,您可以从Capacity属性观察到这一点。虽然这听起来很昂贵,但算法是按O(1)摊销的,操作系统中的虚拟内存子系统确保您不会为不使用的内存实际付费


通过预先猜测容量,可以避免不太便宜的复制。更多详细信息请参见。

可能是下面的真实数组,当新元素没有更多空间时,它会被更长的数组(由一个因子-例如,原始长度的两倍或1.5倍)替换。如果它将使用数组,则不需要它。。。简单阵列也可以使用相同的功能(动态添加/删除)。是的,可以自己管理阵列,但必须执行所有实现。相反,ArrayList是一个实用程序类,它实现列表接口,并为您处理存储/大小调整。你所需要关心的只是存储数据,而不必担心如何存储数据。例如,如果你想制造一辆汽车,你必须重复使用基本部件或从别人那里获得它们。你不想一切从头开始(你不能)。取而代之的是,你可以选择一些基本的部件来制造你的汽车。同样,构建应用程序时,需要使用JavaAPI已经提供的基本数据结构。否则你将不得不重新发明轮子。@Eric Dahlvang,仅供参考链接已断开。
public virtual void set_Capacity(int value)
{
    if (value < this._size)
    {
        throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("ArgumentOutOfRange_SmallCapacity"));
    }
    if (value != this._items.Length)
    {
        if (value <= 0)
        {
            this._items = new object[4];
            goto IL_65;
        }
        object[] array = new object[value];
        if (this._size > 0)
        {
            Array.Copy(this._items, 0, array, 0, this._size);
        }
        this._items = array;
        return;
    }
    IL_65:
}