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 性能更优,不过在使用的过程中 只能指定一种类型。

自定义顺序表ArrayList的更多相关文章

  1. 数据结构之线性顺序表ArrayList(Java实现)

    一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...

  2. 三 模拟实现顺序表ArrayList

    /** * 顺序表,重点是数组动态扩容,插入 * 底层采用数组,长度可以动态变化,此处采用增长一倍 *  java.util.ArrayList每次增长50% *  int newCapacity = ...

  3. Java数据结构-线性表之顺序表ArrayList

    线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...

  4. (java实现)顺序表-ArrayList

    什么是顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 在使用顺序表存储数据前,会先申请一段连续的内存空间(即数组),然后把数组依次存入 ...

  5. C++利用动态数组实现顺序表(不限数据类型)

    通过类模板实现顺序表时,若进行比较和遍历操作,模板元素可以通过STL中的equal_to仿函数实现,或者通过回调函数实现.若进行复制操作,可以采用STL的算法函数,也可以通过操作地址实现.关于回调函数 ...

  6. "《算法导论》之‘线性表’":基于动态分配的数组的顺序表

    我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分 ...

  7. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  8. 【C#】【数据结构】001-线性表:顺序表

    C#数据结构:顺序表结构 1.自定义顺序表结构 using System.Collections; using System.Collections.Generic; /// <summary& ...

  9. C语言实现顺序表(顺序存储结构)

    顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...

  10. Java数据结构-01顺序表

    一.定义 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 二.存储分类 1.顺序存储: ①简述:是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方 ...

随机推荐

  1. git、docker、lunix、python、pycharm等常用命令整理

    git的使用 上传代码git clone ....git branch new_branchgit checkout branch_namegit add .git commit -m "& ...

  2. 输出图形字符的命令 banner

    输出图形字符的命令 banner 有趣的 Linux 命令.来自实验楼操作系统课程 安装 sudo apt install sysvbanner 截图 其他 还有两个类似的命令toilet,figle ...

  3. Burp Suite进阶

    1.Scanner Burp Scanner主要用于自动检测Web系统的各种漏洞. 首先,确认Burp Suite正常启动并完成浏览器代理的配置.然后进入Burp Proxy,关闭拦截代理功能,快速浏 ...

  4. context状态树

    provider customer 父组件 创建context对象并导出 export const AddContext = React.createContext<any>({}) 导出 ...

  5. JavaScript:函数:函数的参数

    声明函数的时候,有个括号,这里面可以加上函数的参数,这些参数,我们叫做形参(形式参数): 此时这些参数,也是已经声明了的变量,只是还没有赋值而已. 也可以不加,取决于函数的逻辑.如果函数需要从外部传进 ...

  6. python多进程程序打包成exe的问题

    粘贴一下部分的多进程代码 if __name__ == '__main__': """"流程模拟""" multiprocessi ...

  7. 分享一个自己项目中用到的.net中正则替换工具处理类(支持先用特征匹配内容整体模板,同时模板内对相关字内容进行替换)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. Python二维码扫描

    原文链接:https://blog.easyctf.cn/Moxin/59365.html 模块准备 1.pyzbar pip install pyzbar 2.PIL 注意:PIL只支持Python ...

  9. Hive详解(06) - Hive调优实战

    Hive详解(06) - Hive调优实战 执行计划(Explain) 基本语法 EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query 案例实操 ...

  10. Windows 11 内核新调试器「GitHub 热点速览 v.23.01」

    本周热点趋势榜虽然新项目不多,但是还是有几个不错值得收藏的工具项目,比如用来做文本转语音的 tortoise-tts 能生成更加贴近真实人声的语音,让 Golang 并发更出色的 conc,以及通过 ...