package com.camile._1.Impl;
import com.camile._1.Interface.ArrayList;
import com.camile._1.Interface.Iterator;
import com.camile._1.ex.MyArrest;
/**
* Created by Administrator on 2017/2/25.
*/
public class MyArraryList extends ArrayList {
private Object[] objArr;
private int size;
private int postion;
public MyArraryList() {
this.objArr = new Object[10];
this.size = 10;
this.postion = 0;
}
public MyArraryList(int size) {
this.objArr = new Object[size];
this.size = size;
this.postion = 0;
}
public MyArraryList(Object[] objArr) {
this.objArr = objArr;
this.size = objArr.length;
this.postion = objArr.length - 1;
}
@Override
public void add(Object o) {
int limit = this.size + (this.size / 2);
Object[] newObjArr = new Object[limit];
//public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)从指定源数组中复制一个数组,
// 复制从指定的位置开始,到目标数组的指定位置结束。从src引用的源数组到dest引用的目标数组,
// 数组组件的一个子序列被复制下来。被复制的组件的编号等于length参数。
// 源数组中位置在srcPos到srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。
System.arraycopy(this.objArr, 0, newObjArr, 0, objArr.length);
this.postion = this.size - 1;
newObjArr[this.postion] = o;
this.size = limit;
objArr = null;
this.objArr = newObjArr;
}
@Override
public void add(int index, Object o) {
arrIndexVildate(index);
objArr[index - 1] = o;
size++;
}
@Override
public Object get(int index) {
arrIndexVildate(index);
return objArr[index - 1];
}
@Override
public Object remove(int index) {
arrIndexVildate(index);
Object remoteObj = objArr[index - 1];
objArr[index - 1] = null;
size--;
//TODO need GC ccontrol
return remoteObj;
}
@Override
public int size() {
return this.size;
}
@Override
public Iterator iterator() {
return new ArrayListIterator(this);
}
private class ArrayListIterator implements Iterator {
private MyArraryList arraryList;
private int index;
public ArrayListIterator(MyArraryList arraryList) {
this.arraryList = arraryList;
this.index = arraryList.size - 1;
}
public boolean hasNext() {
if (index > arraryList.size) {
return true;
} else {
return false;
}
}
public Object next() {
Object obj = arraryList.get(index);
index++;
return obj;
}
}
private void arrIndexVildate(int index) {
if (index > size - 1 || index < 0) {
new Exception(String.format("cant than that array index %s,but got %", size - 1, index));
}
}
//test method
public static void main(String[] args) {
MyArraryList myArrary = new MyArraryList();
MyArrest.arrestEq(10, myArrary.size());
myArrary.add(1, 10);
MyArrest.arrestEq(10, myArrary.get(1));
myArrary.add(100);
System.out.println(myArrary.get(11));
myArrary.remove(1);
MyArrest.arrestIsNull(myArrary.get(1));
if (myArrary.iterator().hasNext()) {
myArrary.iterator().next();
}
System.out.println("test myArrary2");
MyArraryList myArrary2 = new MyArraryList(20);
MyArrest.arrestEq(20, myArrary2.size());
myArrary2.add(1, 10);
MyArrest.arrestEq(10, myArrary2.get(1));
myArrary2.add(100);
MyArrest.arrestIsNull(myArrary2.get(20));
myArrary2.remove(1);
MyArrest.arrestIsNull(myArrary2.get(1));
if (myArrary.iterator().hasNext()) {
myArrary2.iterator().next();
}
}
}