ArrayList类是java中的动态数组,简单模拟一下ArrayList的功能实现
1.声明成员变量
Object [] elementData = new Object[10]; //声明一片连续空间数组用来存储数据
int size = 0;//实际存储的元素个数
因为存储数据的类型可能有int,float,String类型,所以用Object类来声明一个一维数组elementData。并且用size变量来记录数组存储的个数
2.添加元素
从数组下标为0存储元素,也就是说当前size的变量的值没有元素存储。
//添加元素
public void add(Object obj){//传入要添加的元素obj
//首先检验数组里面是否可以存储元素(判满),
ensureCapacity(size);//如果数组容量不足就要扩容
elementData[size] = obj; //将变量obj传入数组中
size++; //记录存储元素个数+1
}
3.判满
在添加元素时,应该首先判断数组容量是否能够存储元素,如果数组容量满了,就无法继续向里面添加元素了,那么就需要扩容。
public void ensureCapacity(int length){
if(length>=elementData.length){
//如果当前数组容量不足,就扩容2倍
Object []newElementData = new Object[elementData.length*2];
//将原来的数组里面的元素赋值到扩容后的新数组去
System.arraycopy(elementData,0,newElementData,0,size);
//在将原数组指向新数组
elementData = newElementData;
}
}
关于System.arraycopy()的用法:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
/*
也就是从scePos下标开始的scr数组长度为length的所有元素复制给从下标destPos开始的长度为length的dest数组
第一个参数Object src:传入原始数组名
第二个参数int scrPos:要复制原始数组的第一个元素的下标
第三个参数Object dest :传入要复制的数组名
第四个参数int destPos:要复制的数组的起始下标
第五个参数int length:要复制的元素个数,从每一个起始下标开始记
*/
4.获取下标位置的元素
返回指定索引的元素
public Object get(int index){
//要获取数组下标的元素的话,就要判断给出的索引index是否合法 index合法的范围为:0~size-1
if(index <0||index>size-1){//如果索引不正确就会出现一个异常提示
throw new IllegalArgumentException("索引号不合法:"+index);
}
//如果索引合法,直接返回数组index下标元素就可以啦
return elementData[index];
}
5.移除指定位置的元素
将指定索引下标的元素在对象中去除,并且返回删除的元素
public Object remove(int index){
//传入索引的话,就要判断索引是否合不合法,合法的索引范围为0 - size-1
if(index<0||index>size-1){
throw new IllegalArgumentException("索引号不合法:"+index);
}
Object obj = elementData[index];//记录要删除的元素,方便返回
System.arraycopy(elementData,index+1,elementData,index,size-index-1);
size--;//数组内存储的元素减1
elementData[size]=null;//将最后一个元素初始化
return obj;
}
6.清空元素
public void clear(){
//将每一个元素初始化
for(int i=0;i
7.判空
public boolean isEmpty(){
return size==0;//如果为0返回true,不是则返回false
}
8.获取实际元素个数
public int size(){
return size;//size就是数组里元素的个数
}