package com.coding.basic;
import java.util.concurrent.CyclicBarrier;
/**
* @ClassName: ArrayList
* @Description: 自增长数组
* @author: tangxp
* @date: 2017年2月23日 下午10:43:03
*/
public class ArrayList implements List {
private final int step = 10;
private Object elementData[] = new Object[100];
private int size = 0 ;
/**
* @Title: add
* @Description: TODO
* @param o , elements of this ArrayList
* @see com.coding.basic.List#add(java.lang.Object)
*/
public void add(Object o) {
add(size,o);
}
/**
* @Title: add
* @Description: TODO
* @param index
* @param o
* @see com.coding.basic.List#add(int, java.lang.Object)
*/
public void add(int index, Object o) {
if(index < 0 || index> size) {
throw new IllegalArgumentException("下标越界");
}
if(null == o) {
throw new IllegalArgumentException("元素不能为空");
}
if(this.checkOutOfBounds()) {
this.autoGrow(this.step);
}
int i = size;
while(i>index) {
elementData[i] = elementData[--i];
}
addDriect(i, o);
}
public Object get(int index) {
if(index < 0 || index>= size) {
throw new IllegalArgumentException("下标越界");
}
return elementData[index];
}
public Object remove(int index) {
if(index < 0 || index>= size) {
throw new IllegalArgumentException("下标越界");
}
Object o = elementData[index];
while (index<size-1) {
elementData[index] = elementData[++index];
}
elementData[size] = null;
this.size--;
return o;
}
public int size() {
return this.size;
}
/**
* @param growSize
* 扩展elementData数组growSize大小
*/
private void autoGrow(int growSize) {
if (elementData.length>this.size) {
return;
}
Object newElementData[] = new Object[elementData.length+growSize];
System.arraycopy(elementData, 0, newElementData, 0, elementData.length);
elementData = newElementData;
return;
}
private void addDriect(int index, Object o) {
elementData[index] = o;
this.size++;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
for(int i =0;i<this.size;i++) {
sb.append(elementData[i].toString());
sb.append(",");
}
sb.replace(sb.length()-1, sb.length(), "]");
return sb.toString();
}
private boolean checkOutOfBounds() {
if (elementData.length>this.size) {
return false;
}else {
return true;
}
}
}