对于ArrayList相比大家都很熟悉,它是java中最常用的集合之一。下面就给出它的自我实现的java代码。
需要说明的一点是,它是基于数组创建的。所以它在内存中是顺序存储,对于查找十分的方便。
package com.pinjia.shop.common.collection; import java.util.Iterator; import java.util.NoSuchElementException; /** * Created by wangwei on 2017/1/3. * ArrayList的自己封装,实现 */ public class MyArrayList<E> implements Iterable<E> { private static final int DEFAULT_SIZE = 10;//容器默认大小 private int theSize; private E[] theItems; public MyArrayList(){ clear(); } public void clear(){ theSize = 0; ensureCapacity(DEFAULT_SIZE); } public int size(){ return theSize; } public boolean isEmpty(){ return size() == 0; } public void trimToSize(){ ensureCapacity(size()); } public E get(int idx){ if(idx<0||idx>=size()) throw new ArrayIndexOutOfBoundsException(); return theItems[idx]; } public E set(int idx,E newVal){ if(idx<0||idx>size()) throw new ArrayIndexOutOfBoundsException(); E old = theItems[idx]; theItems[idx] = newVal; return old; } public void ensureCapacity(int newCapacity) { //数组的扩展 if(newCapacity<theSize) return; E[] old = theItems; theItems = (E[])new Object[newCapacity]; for(int i=0;i<size();i++){ theItems[i] = old[i]; } } public boolean add(E x){ add(size(),x); return true; } public void add(int idx,E 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 E remove(int idx){ E removeItem = theItems[idx]; for(int i=idx;i<size()-1;i++){ theItems[i] = theItems[i+1]; } theSize--; return removeItem; } public Iterator<E> iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator<E>{ //内部类 private int current = 0; public boolean hasNext(){ return current<size(); } public E next(){ if(!hasNext()) throw new NoSuchElementException(); return theItems[current++]; } public void remove(){ MyArrayList.this.remove(--current); } } }