package com.coding.basic;
import java.util.Arrays;
import java.util.NoSuchElementException;
import com.coding.basic.List;
import com.coding.basic.Iterator;
public class MyArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE;
private static final int DEFAULT_CAPACITY = 10;
//�����캯��
public MyArrayList(){
this(DEFAULT_CAPACITY);
}
public MyArrayList(int size){
if (size < 0){
throw new IllegalArgumentException("Ĭ�ϵĴ�С" + size);
}
else{
elementData = new Object[size];
}
}
public void add(Object o){
isCapacityEnough(size+1);
elementData[size++] = o;
}
private void isCapacityEnough(int size){
//�ж��Ƿ���ʼ�������Ƿ���Ҫ����
if (size > DEFAULT_CAPACITY){
explicitCapacity(size);
}
if (size < 0){
throw new OutOfMemoryError();
}
}
private void explicitCapacity(int capacity){
int oldCapacity = elementData.length;
//������=������ + ��������/2�� ����1.5�������Ʋ������൱�ڳ���2��
int newLength = oldCapacity + (oldCapacity >> 1);
if (newLength - capacity < 0){
newLength = capacity;
}
//�ж�newLength�ij���
//����������涨�������������ж�Ҫ��Ҫ�����ݿռ��Ƿ�����������
//���������newLengthΪ MAX_VALUE ������Ϊ MAX_ARRAY_LENGTH��
if (newLength > (MAX_ARRAY_LENGTH)){
newLength = (capacity > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH);
}
//����copyof��������
elementData = Arrays.copyOf(elementData, newLength);
}
public void add(int index, Object o){
checkRangeForAdd(index);
isCapacityEnough(size +1);
// �� elementData�д�Indexλ�ÿ�ʼ������Ϊsize-index��Ԫ�أ�
// ���������±�Ϊindex+1λ�ÿ�ʼ���µ�elementData�����С�
// ������ǰλ�ڸ�λ�õ�Ԫ���Լ����к���Ԫ������һ��λ�á�
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
//�ж��Ƿ�Խ��
private void checkRangeForAdd(int index){
if (index < 0 || index > size){
throw new IndexOutOfBoundsException("ָ����indexԽ��");
}
}
// ���ش��б���ָ��λ���ϵ�Ԫ�ء�
public Object get(int index){
checkRange(index);
return elementData[index];
}
//�ж��Ƿ�Խ��
private void checkRange(int index){
if (index >= size || index < 0){
throw new IndexOutOfBoundsException("ָ����indexԽ��");
}
}
public Object remove(int index){
Object value = get(index);
int moveSize = size - index -1;
if (moveSize >0){
System.arraycopy(elementData, index +1, elementData, index, size - index -1);
}
elementData[--size] = null;
return value;
}
public int size(){
return size;
}
//������
public Iterator iterator(Object o){
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator{
private int currentIndex=0;
public boolean hasNext() {
return currentIndex < size();
}
public Object next() {
if (!hasNext()){
throw new NoSuchElementException();
}
return new Object[currentIndex + 1];
}
}
}