arraylist java c#_arraylist C#实现原理

如果要动态地改变数组所占用内存空间的大小,则需以数组为基础进一步抽象,以实现这个功能。以图2.2的学生宿舍为例,为了使A班的所学生住在连续的宿舍内,可以把A班的学生全部搬迁到连续的5间空宿舍内。其效果如图2.6所示:

96859dc6980b2d24eb537a5a381811a3.png

现实中,为了让一个班新加入的10个学生能跟原来的学生住在一起而把班级整体搬迁,这样的做法显示不合适,因为搬迁的成本太高。但在计算机中,内存成片区域间的拷贝成本是非常低的,这样的解决方案是合理可行的。

但是这个解决方案还存在问题,如果一个班级频繁地有新学生加入,为了保证学生能住在连续的宿舍内,整个班级就不得不频繁地搬迁。可以采用以空间换时间的做法来解决这个问题,在学生每次搬迁时,都让班级宿舍的数量是原来的两倍。也就是说,如果原来一个班级有4间宿舍,搬迁后就变为8间,再次搬迁则变为16间。如图2.2所示,A班的宿舍为201~208。206~208这三间宿舍做为本班备用宿舍,不再允许其他班级的学生搬入。

C#中的ArrayList正是采用上述方法来动态改变数组大小的。ArrayList又被称为动态数组,它的存储空间可以被动态改变,同时还拥有添加、删除元素的功能。

下面列出了ArrayList的部分核心代码:

【ArrayList.cs】

using System;

namespace LinearList

{

public class ArrayList

{

// 成员变量

private const int _defaultCapacity = 4; //默认初始容量

private object[] _items; //用于存放元素的数组

private int _size; //指示当前元素个数

//当元素个数为零时的数组状态

private static readonly object[] emptyArray = new object[0];

// 方法

public ArrayList() //默认构造方法

{   //这样做可以避免元素个数为零时的访问出错

this._items = emptyArray;

}

//指定ArrayList初始容量的构造方法

public ArrayList(int capacity)

{

if (capacity < 0)

{   //当容量参数为负数时引发异常

throw new ArgumentOutOfRangeException("capacity",

"为ArrayList指定的初始容量不能为负数");

}

//按照capacity参数指定的长度的值初始化数组

this._items = new object[capacity];

}

//添加一个方法

public virtual int Add(object value)

{   //当空间满时

if (this._size == this._items.Length)

{   //调整空间

this.EnsureCapacity(this._size + 1);

}

this._items[this._size] = value; //添加元素

return this._size++; //使长度加1

}

//动态调整数组空间

private void EnsureCapacity(int min)

{

if (this._items.Length < min)

{   //空间加倍

int num = (this._items.Length == 0) ?

_defaultCapacity : (th

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值