上代码:
package com.itany.MyArrayList;
import java.util.Iterator;
public class MyArrayList<T> implements Iterable<T>
{
private static final int DEFAULT_CAPACITY=10;//默认数组容量大小
private int theSize;//集合中元素的个数大小
private T[] theItems;//集合中的数组
public MyArrayList()
{
theSize=0;
clear();
}
public int size()
{
return theSize;
}
//清除所有集合中的所有元素
public void clear()
{
theSize=0;
ensureCapacity(DEFAULT_CAPACITY);
}
public boolean isEmpty()
{
return size()==0;
}
//缩小数组大小 缩小到和集合中元素个数一样大
public void trimToSize()
{
ensureCapacity(size());
}
public T get(int idx)
{
//注意这里idx>最好写size()因为 get方法返回的是T 如果写theItems.length可能返回的是一个空 而不是对应的T
if(idx<0 || idx>=size())
throw new ArrayIndexOutOfBoundsException();
return theItems[idx];
}
//返回被修改的原始值
public T set(int idx,T newT)
{
if(idx<0 || idx>size())
throw new ArrayIndexOutOfBoundsException();
T old=theItems[idx];
theItems[idx]=newT;
return old;
}
//根据新的容量大小来扩充theItems数组的大小 并且把旧的数组内容传进新theItems的里面
public void ensureCapacity(int newCapacity)
{
//如果新容量大小<集合中元素的个数 则直接结束方法
if(newCapacity<theSize)
return;
T[] old=theItems;
//theItems=new T[newCapacity]; Cannot create a generic array of T不能直接new泛型数组
theItems=(T[])new Object[newCapacity];//只能这样写 这样的警告不可避免
//把所有旧的数组里面内容全部给到新的容量数组里面 注意在clear调用时 由于theSize=0 不会赋值
for(int i=0;i<size();i++)
{
theItems[i]=old[i];//剩余的为空
}
}
//直接默认加在最后一个
public void add(T newT)
{
add(size(),newT);
}
public void add(int idx,T newT)
{
//在插入时,需要考虑集合的元素个数是否已经等于数组的容量大小 负责需要对数组容量进行扩容
if(size()==theItems.length)
ensureCapacity(2*size()+1);
//此时数组容量是大于集合元素个数
//对于插入有两种可能 1如果插入位置>=size()大小的位置 那么不需要移动 2另一种 如果插入位置<size() 则需要平移
//但是两者都需要相同的语句theItems[idx]=newT
for(int i=size();i>idx;i--)//size()>idx的情况 不满足的话 不执行跳过即可
{
theItems[i]=theItems[i-1];
}
theItems[idx]=newT;//所有情况都要
theSize++;
}
public T remove(int idx)
{
T oldT=theItems[idx];
for(int i=idx;i<size()-1;i++)
{
theItems[i]=theItems[i+1];
}
theSize--;
return oldT;
}
@Override
//重写iterator方法 以获得一个自己写的ArrayListIterator迭代器
public Iterator<T> iterator()
{
// TODO Auto-generated method stub
return new ArrayListIterator();
}
//自己写的迭代器类ArrayListIterator
private class ArrayListIterator implements Iterator<T>
{
private int current=0;
@Override
public boolean hasNext()
{
return current<size();
}
@Override
public T next()
{
if(!hasNext())
throw new java.util.NoSuchElementException();
return theItems[current++];//current是先调用后+1
}
@Override
public void remove()
{
//调用完next之后 current已经+1 因此要先-1 再删除当前
//不能只写this.remove(--current); 因为这个this是ArrayListIterator对象
MyArrayList.this.remove(--current);
}
}
}
package com.itany.MyArrayList;
import java.util.Iterator;
public class Test
{
public static void main(String[] args)
{
MyArrayList<Integer> my=new MyArrayList<Integer>();
my.add(12);
my.add(11);
my.add(13);
my.add(2,14);
my.remove(1);
Iterator<Integer> it=my.iterator();
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
}
}
原文地址:http://blog.csdn.net/u012411414/article/details/44133261