package com.coding.mybasic;
public class ArrayList implements List{
private static final int DEF_CAPACITY = 10;
private int size;
private Object[] elementData;
public ArrayList(){
elementData = new Object[DEF_CAPACITY];
}
public ArrayList(int initCapacity) {
if(initCapacity <= 0){
throw new RuntimeException("初始化长度必须大于0");
}
elementData = new Object[initCapacity];
}
@Override
public void add(Object element) {
checkArrayOutOfRange();
elementData[size++] = element;
}
@Override
public void add(int index, Object element) {
// 末尾插入
if(index == size){
add(element);
return;
}
// index 在 0到size 之间,index之后元素要后移
checkIndex(index);
checkArrayOutOfRange();
moveBackwardElement(index);
elementData[index] = element;
size++;
}
@Override
public Object get(int index) {
checkIndex(index);
return elementData[index];
}
@Override
public Object remove(int index) {
checkIndex(index);
Object temp = elementData[index];
moveForwardElement(index);
elementData[size--] = null;
return temp;
}
@Override
public int size() {
return size;
}
@Override
public Iterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator{
private int i = 0;
@Override
public boolean hasNext() {
return i < size;
}
@Override
public Object next() {
checkIndex(i);
return elementData[i++];
}
}
/**
* 数组增长
* @param newCapacity 新数组容量
*/
private void grow(int newCapacity) {
Object[] dest = new Object[newCapacity];
System.arraycopy(elementData, 0, dest , 0, elementData.length);
elementData = dest;
}
/**
* 检查index index >=0 且 < size
* @param index
* @throws Exception
*/
private void checkIndex(int index) {
if(index < 0){
throw new RuntimeException("index 必须大于0");
}
// 越界
if(index >= size){
throw new RuntimeException("index 必须小于size:" + size);
}
}
/**
* 检查数组容量是否已满,已满则扩容
*/
private void checkArrayOutOfRange() {
if(size >= elementData.length){
// 扩容 默认新容量是原来容量的2倍
grow(elementData.length * 2);
}
}
/**
* 后移元素,从index开始
* @param index
*/
private void moveBackwardElement(int index) {
for (int i = size; i > index; i--) {
elementData[i] = elementData[i - 1];
}
}
/**
* 前移元素,从index开始
* @param index
*/
private void moveForwardElement(int index) {
for (int i = index; i < size; i++) {
elementData[i] = elementData[i + 1];
}
}
}