最近看的书叫“数据结构与算法分析,java语言描述”,里面有讲到各种数据结构的实现。今天先写出最简单的一部分,ArrayList的实现
import java.util.Iterator;
public class MyArrayList<T> implements Iterable<T>
{
private static final int DEFAULT_CAPACIY = 10;
private int theSize;
private T[] theItems;
public MyArrayList(){doClear();}
public void clear(){doClear();}
public void doClear(){theSize = 0 ; ensureCapacity(DEFAULT_CAPACIY);}
public int size(){ return theSize;}
public boolean isEmpty(){return theSize == 0;}
public void trimToSize(){ensureCapacity(size());}//删除掉没有用的剩余空间,只把有用的部分留下来
public T get(int idx){
if(idx < 0 || idx >=size())
throw new ArrayIndexOutOfBoundsException();
return theItems[idx];
}
public T set(int idx, T newVal){
if(idx < 0 || idx >=size())
throw new ArrayIndexOutOfBoundsException();
T old = theItems[idx];
theItems[idx] = newVal;
return old;
}
public void ensureCapacity(int newCapacity){//对list进行扩充,满足动态性
if(newCapacity < size())
return;
T[] old = theItems;
theItems = (T[])new Object[newCapacity];
for(int i = 0 ; i < size(); i++)
theItems[i] = old[i];
}
public boolean add(T x){add(size(),x);return true;}
public void add(int idx,T x){
if(theItems.length==size()){ensureCapacity(size()*2+1);}
for(int i = theSize; i > idx ; i++)
theItems[i] = theItems[i-1];
theItems[idx] = x;
theSize++;
}
public T remove(int idx){
T removeItem = theItems[idx];
for(int i = idx ; i < theSize ; i++)
theItems[i] = theItems[i+1];
theSize--;
return removeItem;
}
@Override
public Iterator<T> iterator() {
// TODO Auto-generated method stub
return new ArrayListIterator();
}
//用常规内部类构造出一个迭代器
private class ArrayListIterator implements Iterator<T>
{
private int current = 0;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return current < theSize;
}
@Override
public T next() {
// TODO Auto-generated method stub
if(!hasNext())
throw new ArrayIndexOutOfBoundsException();
return theItems[current++];
}
@Override
public void remove() {
// TODO Auto-generated method stub
MyArrayList.this.remove(--current);
}
}
}