1.创建MyList接口
public interface MyList {
public int size();
public void add(Object obj);
public Object remove(int index);
public void set(int index,Object element);
public Object get(int index);
public boolean contians(Object obj);
}
2.创建ArrayList
import java.util.Arrays;
public class MyArrayList implements MyList {
//存放数据的数组
Object [] elementData;
//默认的空数组
private static final Object [] DEFAULTCAPACITY_ELEMENTDATA={};
private static final Object [] DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};
//记录数组中有几个元素
int size;
//定义一个默认容量
private static final int DEFAULT_CAPACITY=10;
public MyArrayList(){
this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
@Override
public int size() {
return this.size;
}
@Override
public void add(Object obj) {
ensureCapacity(size+1);
elementData[size++]=obj;
}
private void ensureCapacity(int minCapacity) {
//判断容量是否够用 够用就不扩展 不够用就扩展
if(minCapacity>=elementData.length){
//如果是0数组长度 就给默认值10
if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
this.elementData=new Object[DEFAULT_CAPACITY];
}else {
//原始数组已经有数据
//计算新数组容量
int oldCapacity=elementData.length;
int newCapacity= oldCapacity+(oldCapacity>>1);//在老容量基础上扩大50%
//构建新数组
Object[] newArray = new Object[newCapacity];
//把老数组中的数据复制到新数组中
System.arraycopy(elementData,0,newArray,0,elementData.length);
//把新数组存放到老的对象引用中
this.elementData=newArray;
}
}
}
@Override
public Object remove(int index) {
//检查下标不能超范围
if(index >= size) {
throw new IndexOutOfBoundsException("下标越界");
}
//获取要删除的数据
Object oldValue=elementData[index];
//删除数据
//计算删除数据位置后面还有几个数据
int numMoved=size-index-1;
if(index!=size-1) {
System.arraycopy(elementData,index+1,elementData,index,numMoved);
}
//把最后一个设定为null
elementData[--size]=null;
return oldValue;
}
@Override
public void set(int index, Object element) {
//检查下标不能超范围
if(index >= size) {
throw new IndexOutOfBoundsException("下标越界");
}
elementData[index]=element;
}
@Override
public Object get(int index) {
//检查下标不能超范围
if(index >= size) {
throw new IndexOutOfBoundsException("下标越界");
}
return elementData[index];
}
@Override
public boolean contians(Object obj) {
//通过遍历数组搜索对象 如果找不到就返回false
boolean has=false;
for( int i=0;i<size;i++) {
if( obj == elementData[i]) {
has=true;
break;
}
}
return has;
}
@Override
public String toString() {
String str="[";
for (int i=0;i<size;i++) {
if (i==size-1) {
str += elementData[i];
}else {
str += elementData[i]+",";
}
str+="]";
}
return str;
}
}
关于ArrayList扩容的原理:使用移位运算扩大数组容量,创建新数组,将新数组赋给老数组