java用数组实现ArrayList
- ArrayList继承自AbstractList,实现了List接口,同时还实现了RandomAccess、Cloneable、Serialzable接口,所以ArrayList支持快读访问、复制、序列化,底层基于数组实现、容量大小动态变化
public class MyArrayList<E> {
/**
* 默认容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 集合中元素个数
*/
private int size;
/**
* 存储集合中元素
*/
private Object[] elementData;
/**
* 如果有初始化容量的时候,就会使用这个对象来初始化
*/
private Object[] EMPTY_ELEMENT_DATA = {};
/**
* 如果使用默认的构造函数的话,就会使用这个对象初始化
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 集合最大长度
*/
private int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
public MyArrayList(){
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public MyArrayList(int initialCapacity){
if(initialCapacity>0){
this.elementData = new Object[initialCapacity];
}else if(initialCapacity==0){
this.elementData = EMPTY_ELEMENT_DATA;
}else {
throw new IllegalArgumentException();
}
}
public int size(){
return this.size;
}
public boolean isEmpty(){
return this.size==0;
}
public boolean add(E e) {
int minCapacity = size+1;
if(this.elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
minCapacity = Math.max(minCapacity,DEFAULT_CAPACITY);
}
if(minCapacity - this.elementData.length>0){
grow(minCapacity);
}
elementData[size++] = e;
return true;
}
public void grow(int minCapacity){
int oldCapacity = this.elementData.length;
int newCapacity = oldCapacity+(oldCapacity>>1);
if(newCapacity-minCapacity<0){
newCapacity = minCapacity;
}
if (newCapacity - MAX_ARRAY_SIZE > 0){
newCapacity = MAX_ARRAY_SIZE;
}
this.elementData = Arrays.copyOf(this.elementData,newCapacity);
}
public E get(int index){
rangeCheck(index);
return null;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException();
}
}