自定义顺序表ArrayList
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的更多相关文章
- 数据结构之线性顺序表ArrayList(Java实现)
一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...
- 三 模拟实现顺序表ArrayList
/** * 顺序表,重点是数组动态扩容,插入 * 底层采用数组,长度可以动态变化,此处采用增长一倍 * java.util.ArrayList每次增长50% * int newCapacity = ...
- Java数据结构-线性表之顺序表ArrayList
线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...
- (java实现)顺序表-ArrayList
什么是顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 在使用顺序表存储数据前,会先申请一段连续的内存空间(即数组),然后把数组依次存入 ...
- C++利用动态数组实现顺序表(不限数据类型)
通过类模板实现顺序表时,若进行比较和遍历操作,模板元素可以通过STL中的equal_to仿函数实现,或者通过回调函数实现.若进行复制操作,可以采用STL的算法函数,也可以通过操作地址实现.关于回调函数 ...
- "《算法导论》之‘线性表’":基于动态分配的数组的顺序表
我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分 ...
- 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...
- 【C#】【数据结构】001-线性表:顺序表
C#数据结构:顺序表结构 1.自定义顺序表结构 using System.Collections; using System.Collections.Generic; /// <summary& ...
- C语言实现顺序表(顺序存储结构)
顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...
- Java数据结构-01顺序表
一.定义 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 二.存储分类 1.顺序存储: ①简述:是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方 ...
随机推荐
- swiper3踩坑
1. 公司一个项目里用的 swiper3 然后同一项目下还装了vue-awesome-swiper需求swiper4...研究半天终于搞明白第一个问题 2. 然后我寻思就按照swiper3官网文档来写 ...
- 使用echarts(可视化图表库)
一:echarts 1.简介 一个基于 JavaScript 的开源可视化图表库 echarts官网使用教程: https://echarts.apache.org/zh/index.html 2.e ...
- 2022年7月13日,第四组 周鹏 JAVA认识的第一天,附加一个用JS写的计算器代码
心情:╭(╯^╰)╮ ╮(╯﹏╰)╭ (╯﹏╰)b 罒ω罒 |*´Å`)ノ ( Ĭ ^ Ĭ ) (ㄒoㄒ) o(╥﹏╥)o /(ㄒoㄒ)/~~ (〒︿〒) ┭┮﹏┭┮ ε(┬┬﹏┬┬)3 ε(┬┬﹏┬ ...
- Linux利用crontab执行定时任务
Linux利用crontab执行定时任务 crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认 ...
- C#开发的资源文件程序(可国际化) - 开源研究系列文章
上次将小软件的线程池描述了,也将插件程序描述了,这次就将里面的资源文件相关的内容进行下记录,这里能够让程序做成国际化的形式(即多语言程序),主要就是通过这个资源文件的方式进行的处理.下面将对这个资源文 ...
- 《Effective C++》继承与面向对象设计
Item 32:确定你的public继承塑膜出is-a的关系 如果你令class D以public继承class B,你便是告诉编译器说,每一个类型为D的对象同时也是一种B对象,反之如果你需要一个D对 ...
- [cocos2d-x]判断两个矩形是否有交叉区域
bool Rect::intersectsRect(const Rect& rect) const { return !( getMaxX() < rect.getMinX() || r ...
- 基于 VScode 搭建 Verilog 自动格式化
插件 Verilog-HDL/SystemVerilog/Bluespec SystemVerilog SystemVerilog and Verilog Formatter 工具 https://g ...
- WPF开发经验-实现一种三轴机械手控件
一 引入 考虑实现一种三轴机器人控件. 三轴机器人用来将某种工件从一个位置运送到另一个位置. 其X轴为手臂轴,可以正向和反向运动,它处于末端,直接接触工件: 其T轴为旋转轴,可以对手臂进行旋转: 其Z ...
- 一文讲尽Thread类的源码精髓
摘要:今天,我们就一起来简单看看Thread类的源码. 本文分享自华为云社区<[高并发]Thread类的源码精髓>,作者:冰 河. 前言 最近和一个朋友聊天,他跟我说起了他去XXX公司面试 ...