package com.work.week01; import java.io.Serializable; import java.util.Arrays; /** * ʵ��List<E>�ӿڣ�������ķ�ʽʵ���Լ���ArrayList * @author denghuaijun * * @param <E> */ public class MyArrayList<E> implements MyList<E>,Serializable { private static final long serialVersionUID = 4145346362382387995L; /** * ����<MyArrayList>Ĭ�ϴ�С */ private static final int DEFAULT_CAPACITY = 10; /** * ����<MyArrayList>Ĭ�Ͽ����� */ private static final Object[] EMPTY_ELEMENTDATA = {}; transient Object[] elementData; /** * <MyArrayList>��С */ private int size; public MyArrayList(){ this.elementData = EMPTY_ELEMENTDATA; } public MyArrayList(int capacity){ if(capacity > 0){ this.elementData = new Object[capacity]; }else if(capacity == 0){ this.elementData = EMPTY_ELEMENTDATA; }else{ throw new IllegalArgumentException("�Ƿ�����"); } } private void ensureCapacity(int minCapacity){ if(this.elementData == EMPTY_ELEMENTDATA){ minCapacity = Math.max(minCapacity, DEFAULT_CAPACITY); } if(minCapacity > elementData.length){//����λ�ô����������鳤�� grow(minCapacity); } } private void grow(int minCapacity){ int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if(newCapacity < minCapacity){ newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } @Override public boolean add(E element) { ensureCapacity(size + 1); elementData[size++] = element; return true; } @Override public void add(int index, E element) { //ȷ��index�Ƿ�Խ�� checkAddRange(index); //ȷ�����鳤���Ƿ��㹻 ensureCapacity(size + 1); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } private void checkAddRange(int index){ if(index < 0 || index > size){//index == size ������������Ԫ�� throw new IndexOutOfBoundsException("����Խ��"); } } @SuppressWarnings("unchecked") @Override public E get(int index) { checkRange(index); return (E) elementData[index]; } private void checkRange(int index){ if(index < 0 || index >= size){ throw new IndexOutOfBoundsException("����Խ��"); } } @SuppressWarnings("unchecked") @Override public E remove(int index) { checkRange(index); E element = (E) elementData[index]; int numMoved = size - index - 1; if(numMoved > 0){ System.arraycopy(elementData, index + 1, elementData, index, numMoved); } elementData[size--] = null; return element; } @Override public int size() { return size; } @Override public boolean isEmpty() { return size == 0; } public int indexOf(Object o) { if(o == null){ for(int i=0;i<size;i++){ if(elementData[i] == null){ return i; } } }else{ for(int i=0;i<size;i++){ if(o.equals(elementData[i])){ return i; } } } return -1; } public int lastIndexOf(Object o) { if(o == null){ for(int i=size-1;i>=0;i--){ if(elementData[i] == null){ return i; } } }else{ for(int i=size-1;i>=0;i--){ if(o.equals(elementData[i])){ return i; } } } return -1; } @Override public MyIterator<E> iterator() { return new MyIter(); } private class MyIter implements MyIterator<E>{ int flag = -1; public MyIter(){ flag = size; //���鳤�� } @Override public boolean hasNext() { return flag > 0; } @SuppressWarnings("unchecked") @Override public E next() { if(!hasNext()){ throw new IndexOutOfBoundsException("����ֵ�������鷶Χ"); } return (E) elementData[size-(flag--)]; } } public static void main(String[] args) { MyArrayList<String> array = new MyArrayList<String>(); array.add("1"); array.add("2"); array.add("3"); array.add("4"); array.remove(2); array.add(2, "1"); System.out.println("size="+array.size()); System.out.println("indexOf(3)="+array.indexOf("3")); System.out.println("lastIndexOf(1)="+array.lastIndexOf("1")); MyIterator<String> itr = array.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }