package com.util_1;
import java.util.Arrays;
import java.util.NoSuchElementException;
/**
* Created by 14258 on 2017/2/27.
*/
public class MyArrayList implements MyList {
private int size;
private Object[] elementData;
private static final int DEFAULTCAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public MyArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public MyArrayList(int initCapacity) {
if (initCapacity == 0) {
elementData = EMPTY_ELEMENTDATA;
} else if (initCapacity > 0) {
this.elementData = new Object[initCapacity];
} else {
throw new IllegalArgumentException("非法参数" + initCapacity);
}
}
@Override
public boolean add(Object o) {
ensureInternalCapacity(size + 1);
elementData[size++] = o;
return true;
}
/**
* @param index
* @param o
*/
@Override
public void add(int index, Object o) {
rangeAddCheck(index);
ensureInternalCapacity(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
/**
* 判断是否第一次插入,如果是,设置为默认长度为10的数组,
*
* @param miniCapacity
*/
private void ensureInternalCapacity(int miniCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
miniCapacity = Math.max(DEFAULTCAPACITY, miniCapacity);
}
ensureExplicitCapacity(miniCapacity);
}
/**
* 判断是否扩容,如果待插入的大于现在数组的长度,则扩容;
*
* @param miniCapacity
*/
private void ensureExplicitCapacity(int miniCapacity) {
if (miniCapacity - elementData.length > 0) {
grow(miniCapacity);
}
}
/**
* 扩容
*
* @param miniCapacity
*/
private void grow(int miniCapacity) {
int oldLength = elementData.length;
int newLength = oldLength + (oldLength >> 1);
if (newLength - miniCapacity < 0) {
newLength = miniCapacity;
}
elementData = Arrays.copyOf(elementData, newLength);
}
/**
* 检查add下标范围
*
* @param index
*/
private void rangeAddCheck(int index) {
if (index > size || index < 0) {
throw new ArrayIndexOutOfBoundsException();
}
}
/**
* 根据下标移除
*
* @param index
* @return
*/
@Override
public Object remove(int index) {
rangeCheck(index);
Object oldValue = elementData[index];
int movNum = size - index - 1;
if (movNum > 0) {//如果只有一个元素,就不走
System.arraycopy(elementData, index + 1, elementData, index, movNum);
}
elementData[--size] = null;
return oldValue;
}
/**
* 获取和删除下标检查
*
* @param index
*/
private void rangeCheck(int index) {
if (index >= size || index < 0) {
throw new ArrayIndexOutOfBoundsException();
}
}
/**
* 根据下标获取,
*
* @param index
* @return
*/
@Override
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
@Override
public int size() {
return size;
}
public MyIterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements MyIterator {
private int cursor;//下一个指针
private MyArrayList myArrayList;
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public Object next() {
int i = cursor;
if (i>size()){
throw new NoSuchElementException();
}
Object[] elementData = MyArrayList.this.elementData;
if (i>=elementData.length){
throw new NoSuchElementException();
}
cursor = i +1;
return elementData[i];
}
}
}