ArrayList的Java实现

上代码:

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可能返回的是一个空 而不是对应的Tif(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]=newTfor(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 stubreturn new ArrayListIterator();}//自己写的迭代器类ArrayListIteratorprivate class ArrayListIterator implements Iterator<T>{private int current=0;@Overridepublic boolean hasNext(){return current<size();}@Overridepublic T next(){if(!hasNext())throw new java.util.NoSuchElementException();return theItems[current++];//current是先调用后+1}@Overridepublic 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()+" ");}}}

,不要哭,你要努力地往前看,你要相信阳光总在风雨后,你最终会看到彩虹的。

ArrayList的Java实现

相关文章:

你感兴趣的文章:

标签云: