自己实现ArrayList 帮助我们更好的理解ArrayList类的底层结构
import java.util.ArrayList;
import java.util.List;
/**
* 自己实现一个ArrayList,帮助我们更好的理解ArrayList类的底层结构
* @author Administrator
*
*/
public class MyArrayList /*implements List*/{
private Object[] elementData;//element Data元素 数据
private int size;
public int size() {
return size;
}
//isEmpty类 证容器是否为空
public boolean isEmpty() {
return size==0;
}
//获取数组里该索引的内容
public Object get(int index) {
RangeCheck(index);
return elementData[index];
}
//无参构造器
public MyArrayList() {
this(10);
}
//有参构造器 赋予初始容量
public MyArrayList(int initialCapacity) {
//initialCapacity表示初始容量
//如果初始容量<0,则抛出一个异常
if(initialCapacity<0) {
try {
throw new Exception();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建容器对象
elementData = new Object[initialCapacity];
}
//确保容量是否够用,如果不够则要扩容
private void ensureCapacity() {
if(size==elementData.length) {
Object[] newArray = new Object[size*2+1];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
/*for(int i=0;i<elementData.length;i++) {
newArray[i] = elementData[i];
}*/
elementData = newArray;
}
}
//添加对象
public void add(Object obj) {
//如果容量=10了 那么怎么办呢?这时候就需要扩容
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++;
}
//删除容器中指定索引的对象
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;
}
//删除容器中的拥有该内容的对象
public void remove(Object obj) {
//return有两个含义:一个返回值,一个结束运行
for(int i=0;i<size;i++) {
if(get(i).equals(obj)){
remove(i);
}
}
}
//在指定索引里修改容器中的对象 与add的区别是不往后移动
public Object set(int index,Object obj) {
RangeCheck(index);
Object OldValue = elementData[index];
elementData[index] = obj;
return OldValue;
}
//检查数组是否越界
private void RangeCheck(int index) {
if(index<0||index>=size) {
try {
throw new Exception();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//测试
public static void main(String[] args) {
//List list = new ArrayList();
MyArrayList list = new MyArrayList(3);
list.add("333");
list.add("333");
list.add("333");
System.out.println(list.size());
list.set(2, "222112");
System.out.println(list.get(2));
}
}