实现的功能有
- elementData对象数组用来存放对象
- size 计算容器大小
- ArrayList空构造器,带初始大小的构造器
- ensureCapacity进行对象数组扩容
- rangeCheck进行检查输入值是否在范围内
- get方法返回某一位置对象
- set方法修改某一位置对象
- add方法在结尾增加对象,在指定位置增加对象
- remove删除制定位置对象,删除与传参对象相同的对象
import java.util.ArrayList;
import java.util.List;
/**
* 自己实现一个arraylist,学习底层实现与结构
* @author 袁盛桐
*/
public class MyArrayList{
/**
* 对象数组
*/
private Object[] elementData;
/**
* 容器大小
*/
private int size;
/**
* 返回elementData的size
*/
public int size(){
return this.size;
}
/**
* 空构造器,初始长度为10
*/
public MyArrayList(){
this(10);
}
/**
* initialCapacity是初始容器长度
*/
public MyArrayList(int initialCapacity){
if(initialCapacity < 0){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
elementData = new Object[initialCapacity];
}
/**
* 数组扩容
*/
private void ensureCapacity(){
if(size == elementData.length){
//扩容操作
Object[] newArray = new Object[size*2+1];
//从老数组elementData数组的0位置拷贝到新数组newArray的0位置,拷贝长度为elementData.length
System.arraycopy(elementData,0,newArray,0,elementData.length);
elementData = newArray;
}
}
/**
* 检查输入的index是否在范围内
*/
public void rangeCheck(int index){
if(index<0||index>=size){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 返回某一位置对象
*/
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
/**
* 修改对象
*/
public Object set(int index, Object obj){
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = obj;
return oldValue;
}
/**
* add方法,增加对象
*/
public void add(Object obj){
//数组扩容
ensureCapacity();
//先赋值后自增
elementData[size++] = obj;
}
/**
* 在指定位置增加对象
*/
public void add(int index, Object obj){
rangeCheck(index);
//数组扩容
ensureCapacity();
System.arraycopy(elementData,index,elementData,index+1,size-index);
elementData[index] = obj;
size++;
}
/**
* 删除指定位置对象
* nummoved是判断制定元素是否在中间,如果在中间nummoved是要后面元素提前的数量
* 把最后一个元素设为null
*/
public void remove(int index){
rangeCheck(index);
int numMoved = size - index - 1;
if(numMoved > 0){
System.arraycopy(elementData,index+1,elementData,index,numMoved);
}
elementData[--size] = null;
}
/**
* 删除与obj相同的对象
*/
public void remove(Object obj){
for(int i=0;i<size;i++){
if(get(i).equals(obj)){
remove(i);
}
}
}
}