/**
* @author xulihui
* @date 2020/3/31 17:10
*/
public class ArrayList<E> {
// 定义数组,用户存储集合的元素
private Object[] elementData;
// 定义变量,用户记录数组的个数
private int size;
// 定义空数组,用于在创建集合对象的时候给elementData初始化
private Object[] emptyArray = {};
//定义常量,用户默认初始化集合的容量
private final int DEFAULT_CAPATITY = 10;
public ArrayList() {
elementData = emptyArray;
}
/**
* add 方法
* @param e
* @return
*/
public boolean add(E e) {
// 校验集合长度,是否需要扩容
grow();
elementData[size++] = e;
return true;
}
public E set(int index,E element) {
checkIndex(index);
E value = (E)elementData[index];
elementData[index] = element;
return value;
}
public E remove(int index) {
// 检查索引
checkIndex(index);
E value = (E)elementData[index];
// 计算出要移动元素的个数
int numMoved = size -index-1;
// 要移动的个数是否大于0
if (numMoved > 0) {
System.arraycopy(elementData,index+1,elementData,index,numMoved);
}
// 把最后位置上的元素置为null
elementData[--size] = null;
return value;
}
private void checkIndex(int index) {
if (index < 0 || index>= size) {
throw new IndexOutOfBoundsException("索引越界了");
}
}
// 扩容方法
private void grow() {
// 默认 第一次初始化
if (elementData == emptyArray) {
elementData = new Object[DEFAULT_CAPATITY];
}
// 1.5倍扩容, 如果size == 集合元素的长度,则扩容
if(size == elementData.length) {
//记录老数组的长度
int oldCapacity = elementData.length;
// 右边移动1 相当于除以2 了
int newCapacity = oldCapacity + (oldCapacity >>1);
// 初始化新数组的长度
Object[] object = new Object[newCapacity];
// 参数说明 1. 数据源 2. 从数据源的那个位置 3. 数据源的数据拷贝到哪个数组 4.从目标数据哪个位置开始 5. 数据源中有多少就拷贝多少
System.arraycopy(elementData,0,object,0,elementData.length);
// 把新组数的地址赋值给 elementData
elementData = object;
}
}
public E get(int index) {
checkIndex(index);
return (E) elementData[index];
}
public int getSize() {
return size;
}
public String toString() {
if (size == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i =0;i < size; i++) {
if ( i == size -1) {
sb.append(elementData[i]).append("]");
} else {
sb.append(elementData[i]).append(",");
}
}
return sb.toString();
}
}
public class TestArrayList {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
arrayList.add("4");
System.out.println(arrayList.set(0,"5"));
System.out.println(arrayList.toString());
System.out.println(arrayList.remove(0));
System.out.println(arrayList.toString());
System.out.println(arrayList.get(0));
System.out.println(arrayList.getSize());
}
}