底层ArrayList的简单模拟实现
程序员文章站
2022-04-18 18:36:03
...
模拟底层动态数组的简单实现
由于静态数组的长度一旦初始化就无法改变,这就容易导致栈溢出,我们想要增加数据的时候修改就会过于繁琐。动态数组的出现是我们更容易对已有的数组进行 增,删,改,查 操作。
public class YcList {
private Object[] data;//定义对象数组
private int length;//数组实际的存储个数
//用无参构造器初始化数组长度默认为10
public YcList(){
this.data=new Object[10];
this.length=0;
}
//用有参构造器初始化数组长度,有构造器实参决定数组长度
public YcList(int instance){
this.data=new Object[instance];
this.length=0;
}
//扩容
public void add(Object x){
if( length== ( (int)(data.length*0.8) )){
expansion();
}
data[length]=x;
length++;
}
//指定位置的火绒操作
public void insertAdd(int index,Object x){
if(index<0 || index>length){
throw new RuntimeException("指定索引有误");
}
if( length== ( (int)(data.length*0.8) )){//留有缓冲量,数组满80%的时候扩容
expansion();
}
System.arraycopy(data,index-1,data,index,length-index);
data[--index]=x;
length++;
}
//扩容操作
private void expansion() {
Object[] newData=new Object[(int)(data.length*1.5)];//创建一个数组是原来的1.5倍
System.arraycopy(data,0,newData,0,data.length);//将原数组复制到新数组中
data=newData;//新数组赋值给原数组
//垃圾回收机制
System.gc();
}
//删除操作
public Object remove(int index){
if(index<0 || index>=length){//判断索引是否在数组中
throw new RuntimeException("索引越界");
}
Object obj=data[index];
System.arraycopy(data,index+1,data,index,length-index-1);
length--;
return obj;
}
//获取指定位置的元素
public Object get(int index){
if(index<0 || index>=length){
throw new RuntimeException("指定位置不存在");
}
Object obj=data[index];
return obj;
}
//清空操作
public Object[] clear(){
Object[] data=new Object[10];
length=0;
return data;
}
//返回元素个数
public int size(){
return length;
}
}
上一篇: 吃冤家
下一篇: java中ArrayList的实现模拟