一、动态数组的引入
基本数组的最大的特点:保存的单个相同类型的元素,一旦声明一个原始数组,无论采用哪种实例化方式,数组一旦定义,长度固定不变。
由此我们为了更方便的使用数组,将原数组做扩充,将原始数组封装到自定义的类中,让他具备可以扩展的能力 —> 这样用户在使用时只需要使用提供的数组进行增删改查即可,无需关心数组的越界问题。
所以:动态数组的本质是将原始的数组封装到类中,堆用户淡化数组长度的概念,数组长度不够时,类的内部会自己进行扩容操作。其存储的内容仍然还在原始数组中。
动态数组 = 原始数组封装到类中 + 对外提供的一系列的方便进行增删改查的方法
二、动态数组的实现
第一步,动态数组时属于线性表的一种,因此其继承线性表的接口,我们实现该线性表的接口Seqlist
public interface Seqlist{
//向线性表中添加一个元素,默认在尾部添加
void add (int vol);
//在索引为index的位置插入新元素
void add (int index,int vol);
//查询线性表中是否包含指定元素
boolean contains(int vol);
//返回索引为index的值
int get (int index);
//修改索引为index位置的元素的值,返回修改前的元素值
int set(int index,int newVol);
//删除线性表中索引为index的值,返回删除前的元素
int removeByIndex(int index);
//删除第一个值为val的元素
void removeByValueOnce(int val);
//删除所有值为val的元素
void removeAllvalue(int val);
}
上图中为该接口所有需要实现的方法,接下来我们对这些方法一一进行覆写实现之前,需要创建一个类,来把基本数组封装起来,并且明确好内部所有需要的内容。
第二步:创建类,封装数组继承线性表接口,完成初始化的设定
public class MyArray implements Seqlist{
//实际存储元素的数组,就是上文中提到的那个被封装进类的数组
private int [] elementDatas;
//当前动态数组中实际存储的元素个数size
private int size;
//数组的默认初始化长度(此处为10)
private static final int DEFAULT_CAPACITY = 10;
public MyArray(){ //无参构造,不知道元素个数的时候调用
//默认产生对象时,初始化长度为10
this.(DEFAULT_CAPACITY);
}
public MyArray(int capacity){ //有参构造,知道元素个数的时候调用
this elementData = new int