1.简介

  顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

  顺序表 ArrayList 是对数组 object[] 的再次封装

  相比于数组,顺序表的容量是可变的

2.这里我们尝试自己使用数组封装一个顺序表

using System;

namespace DataStructure
{
/// <summary>
/// 自定义顺序表
/// </summary>
public class ArrayListDS
{
private const int _defaulCapacity = 4; //数组的初始容器
private object[] _items; // 存放数据的数组
private int _size = 0; // 元素个数 /// <summary>
/// 无参构造函数,默认容量为0
/// </summary>
public ArrayListDS()
{
this._items = new object[0];
}
/// <summary>
/// 带容量初始化构造函数
/// </summary>
/// <param name="capacity"></param>
public ArrayListDS(int capacity)
{
if (capacity < 0)
throw new ArgumentOutOfRangeException("capacity", "数组长度不能为负数");
this._items = new object[capacity];
}
/// <summary>
/// 元素个数
/// </summary>
public virtual int Count
{
get { return this._size; }
}
/// <summary>
/// 容量
/// </summary>
public virtual int Capacity
{
get { return this._items.Length; }
set
{
if (value != this._items.Length)
{
if (value < this._size)
throw new ArgumentOutOfRangeException("value", "容量太小了");
// 开辟一个新的内存空间存储元素
object[] destinationArray = new object[value];
if (this._size > 0)
Array.Copy(this._items, 0, destinationArray, 0, this._size);
this._items = destinationArray;
}
}
}
/// <summary>
/// 判断扩容
/// </summary>
private void EnsureCapacity()
{
// _items.Length是数组容量,_size是数组个数
if (this._items.Length == this._size)
this.Capacity = this.Capacity + _defaulCapacity;
}
/// <summary>
/// 判断超出索引
/// </summary>
/// <param name="index">索引</param>
private void OutIndex(int index)
{
if (index < 0 || index >= this._size)
throw new ArgumentOutOfRangeException("index", "索引超出范围");
}
/// <summary>
/// 添加元素
/// </summary>
/// <param name="value"></param>
public virtual void Add(object value)
{
EnsureCapacity();
this._items[this._size] = value;
this._size++;
}
/// <summary>
/// 索引器,可获取值、修改值、新增值
/// </summary>
/// <param name="index">索引</param>
/// <returns></returns>
public virtual object this[int index]
{
get
{
OutIndex(index);
return this._items[index];//获取值
}
set
{
if (index < 0 || index > this._size)
throw new ArgumentOutOfRangeException("index", "索引超出范围");
if (index < this._size)//修改值
this._items[index] = value;
if (index == this._size)//新增值
Add(value);
}
}
/// <summary>
/// 裁剪多余容量
/// </summary>
public virtual void TrimToSize()
{
this.Capacity = this._size;
}
/// <summary>
/// 删除指定索引的元素
/// </summary>
/// <param name="index">索引</param>
public virtual void RemoveAt(int index)
{
OutIndex(index);
if (index < this._size - 1)
{
// 使删除元素后的所有元素向前移一位
Array.Copy(this._items, index + 1, this._items, index, this._size - index - 1);
}
// 最后一位置空
this._items[this._size - 1] = null;
this._size--;
}
/// <summary>
/// 插入
/// </summary>
/// <param name="index"></param>
/// <param name="value"></param>
public virtual void Insert(int index, object value)
{
if (index < 0 || index > this._size)
throw new ArgumentOutOfRangeException("index", "索引超出范围");
EnsureCapacity();
if (index < this._size)
{
// 插入点后面的元素后移一位
Array.Copy(this._items, index, this._items, index + 1, this._size - index);
}
this._items[index] = value;
this._size++;
}
}
}

3.ArrayList 和 List<T> 优劣对比

  了解了ArrayList 的底层,我们知道它使用的是 object数组,会有装箱和拆箱的消耗

  List<T> 使用了泛型,类型安全,比ArrayList 性能更优,不过在使用的过程中 只能指定一种类型。

最新文章

  1. 高等微积分及其应用 nicholas.pdf——下载地址
  2. jquery层级原则器(匹配父元素下的子元素)
  3. workerman 的属性
  4. CCDH证书
  5. struts2,实现Ajax异步通信
  6. pci hole -- 被吞噬的内存
  7. linux - 怎么自动填写有交互的shell脚本 - SegmentFault
  8. poj 3009 Curling 2.0( dfs )
  9. 【Lucene】挖掘相关搜索词
  10. Jquery知识小点备注
  11. 来一轮带注释的demo,彻底搞懂javascript中的replace函数
  12. [20181206]关于一致性读取3.txt
  13. jQuery Distpicker插件 省市区三级联动 动态赋值修改地址
  14. eclipse开启时报错问题
  15. #15 time&amp;datetime&amp;calendar模块
  16. SpringBoot简单的REST风格例子
  17. 问题:ClientIDMode属性;结果:ASP.NET 4.0的ClientIDMode属性
  18. 练习:自己写一个容器ArrayList集合 一一数组综合练习
  19. 禁止 &quot;启动时恢复任何注册的应用程序&quot;
  20. sql server 游标continue,总是死循环

热门文章

  1. 基于MATLAB的人民币识别系统
  2. elasticsearch global 、 filters 和 cardinality 聚合
  3. Django框架路由层-无名有名分组-无名有名分组反向解析
  4. 从源码构建docker-ce
  5. 基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序
  6. ob_DES_艺恩
  7. Jekyll + GitHub Pages + Vercel纯免费搭建独立博客
  8. python之路48 django 视图层、模板层
  9. [数据结构]普里姆(Prim)算法生成最小生成树
  10. BUG日记之————&gt;springboot使用QueryMapper多条件查询