public class MyArrayList
{
//容量
private const int _defaultCapacity = ;
//存放数组元素
private object[] _items;
//数组大小
private int _size;
//元素个数为0的数组状态
private static readonly object[] emptyArray = new object[]; public MyArrayList()
{
this._items = emptyArray;
} public MyArrayList( int capacity)
{
if (capacity<)
{
throw new ArgumentOutOfRangeException("capacity","ArrayList的容量不可为负数!");
}
this._items = new object[capacity];
} //索引器
public virtual object this[int index]
{
get
{
if (index<||index>=this._size)
{
throw new ArgumentOutOfRangeException("index","索引超出范围!");
}
return this._items[index];
} set
{
if (index < || index >= this._size)
{
throw new ArgumentOutOfRangeException("index", "索引超出范围!");
}
this._items[index] = value;
} } //当前数组元素个数
public virtual int Count
{
get {return this._size ;}
} //数组的容量
public virtual int Capacity
{
get { return this._items.Length; }
set
{
if (value!=this._items.Length)
{
if (value<this._size)
{
throw new ArgumentOutOfRangeException("value","容量太小");
}
if (value > )
{//开辟新内存空间存储元素
object[] dest = new object[value];
if (this._size > )
{//搬动元素
Array.Copy(this._items, , dest, , this._size);
}
this._items = dest;
}
else//数组最小的空间为4
{
this._items=new object[_defaultCapacity];
}
}
}
} //元素的添加
public virtual int Add(object value)
{//当空间已满
if (this._size==this._items.Length)
{
this.EnsureCapacity(this._size+);
}
this._items[this._size] = value;
return this._size++;
} //扩容
private void EnsureCapacity(int p)
{
if (this._items.Length<p)
{//空间加倍
int num = (this._items.Length == ) ? _defaultCapacity : (this._items.Length * );
if (num < p)
{
num = p;
}
this.Capacity = num;
}
} //指定位置插入元素
public virtual void Insert( int index,object value)
{
if (index<||index>this._size)
{
throw new ArgumentOutOfRangeException("index","索引超出范围!");
}
if (this._size==this._items.Length)
{
this.EnsureCapacity(this._size + );
}
if (index<this._size)
{
Array.Copy(this._items, index, this._items, index + , this._size - index);
}
this._items[index] = value;
this._size++;
} //移除指定索引的元素
public virtual void Remove(int index)
{
if (index < || index > this._size)
{
throw new ArgumentOutOfRangeException("index", "索引超出范围!");
}
this._size--;
if (index<this._size)
{
Array.Copy(this._items,index+,this._items,index,this._size-index);
}
this._items[this._size]=null;
} //裁剪空间
public virtual void TrimToSize()
{
this.Capacity = this._size;
}
}

01.线性表 ArrayList的更多相关文章

  1. Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder

    1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...

  2. 顺序线性表 ---- ArrayList 源码解析及实现原理分析

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7738888.html ------------------------------------ ...

  3. 数组线性表ArrayList 和链表类LinkedList

    数组线性表类ArrayList 和链表类LinkedList 是实现List接口的两个具体类.ArrayList 数组储存元素,这个数组是动态创建的.如果元素个数超过了数组的容量,就创建一个更大的新数 ...

  4. 01线性表顺序存储_List--(线性表)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  5. Java 线性表、栈、队列和优先队列

    1.集合 2.迭代器 例子: 3.线性表 List接口继承自Collection接口,有两个具体的类ArrayList或者LinkedList来创建一个线性表 数组线性表ArrayList Linke ...

  6. Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)

    1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...

  7. 集合线性表--List之ArrayList

    集合操作——线性表 List: add().remove().subList().list.toArray().array.asList(). List排序:  Collections.sort(li ...

  8. 线性表之何时使用ArrayList、LinkedList?

    前言 线性表不仅可以存储重复的元素,而且可以指定元素存储的位置并根据下表访问元素. List接口的两个具体实现:数组线性表类ArrayList.链表类LinkedList. ArrayList Arr ...

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

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

随机推荐

  1. 20145205 《Java程序设计》第9周学习总结

    教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC目的:让Java程序设计人员在撰写数据库操作程序时可以有个统一的接口,无须依赖特 ...

  2. 3.Powershell编辑器

    工欲善其事,必先利其器.有个得心应手的工具会使你的学习事半功倍.使用什么工具来编辑Powershell指令比较方便呢?笔者前后使用过几个编辑器,有几个比较不错推荐给大家试用. Powershell I ...

  3. DateUtil工具类

    package com.autoserve.mh.common.util;   import java.text.SimpleDateFormat; import java.util.Calendar ...

  4. Request 、Response 与Server的使用

    纯属记录总结,以下图片都是来自 ASP.NET笔记之 Request .Response 与Server的使用 Request Response Server 关于Server.MapPath 方法看 ...

  5. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

  6. Spring mvc example

    Spring mvc example 1.下载spring源包 spring地址:http://www.springsource.org/download 我下的是spring-framework-3 ...

  7. Java-马士兵动态代理模式

    Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...

  8. TortoiseSVN的合并对比工具TortoiseMerge启动时很慢很卡的解决办法

    用了新版本的TortoiseSVN,但是在进行文件版本对比或者是解决冲突的时候,每次都要等上好几秒钟,TortoiseMerge窗口才显示出来.在Visual Studio中使用这个作为SVN工具,也 ...

  9. Source Insight 3.X 标签插件v1.0发布

    Source Insight可以说是一款程序员必备的开发/阅读源码工具,美中不足的是SI没有标签栏,多个源码之间切换很不方便,于是我就乘闲暇之余写了该作品sihook:标签插件;不过严格意义上来说si ...

  10. Visual Studio 2013中因Browser Link引起的Javascript错误

    参考文章:http://www.cnblogs.com/daxnet/archive/2013/10/27/3391146.html Browser Link功能会引起js异常.在调试右侧的三角下拉选 ...