模仿源码自定义ArrayList

来源:互联网 发布:vb.net 用户控件 编辑:程序博客网 时间:2024/05/01 14:51

最近看了下ArrayList的源码,抽空根据ArrayList的底层结构写了一个功能简单无泛型的自定义ArrayLsit,帮助自己更好理解ArrayList:,其实现的底层数据结构为数Object组,代码如下:

        

/** * 自己实现一个ArrayList * */public class MyArrayList  {private Object[] elementData;private int size;public int size(){return size;}public boolean isEmpty(){return size==0;}//默认容量为10public MyArrayList(){this(10);}/** * 自定义容量 * @param initialCapacity */public MyArrayList(int initialCapacity){if(initialCapacity<0){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}elementData = new Object[initialCapacity];}/** * 添加一个元素 * @param obj */public void add(Object obj){//数组扩容和数据的拷贝,重新new一个数组if(size==elementData.length){Object[] newArray = new Object[size*2+1];System.arraycopy(elementData, 0, newArray, 0, elementData.length);elementData = newArray;}elementData[size++]=obj;//size++;}/** * 通过索引获取元素 * @param index * @return */public Object get(int index){rangeCheck(index);return elementData[index];}/** * 通过索引删除元素 * @param index */public void remove(int index){rangeCheck(index);int numMoved = size - index - 1;if (numMoved > 0){System.arraycopy(elementData, index+1, elementData, index,numMoved);}elementData[--size] = null; // Let gc do its work}/** * 删除对应的元素(利用equal判断元素是否一致) * @param obj */public void remove(Object obj){for(int i=0;i<size;i++){if(get(i).equals(obj)){  //注意:底层调用的equals方法而不是==.remove(i);}}}/** * 设置索引对应的元素 * @param index * @param obj * @return */public Object set(int index,Object obj){rangeCheck(index);Object oldValue =  elementData[index];elementData[index] = obj;return oldValue;}/** * 将元素插入对应的位置 * @param index * @param obj */public void add(int index,Object obj){rangeCheck(index);ensureCapacity();  //数组扩容System.arraycopy(elementData, index, elementData, index + 1, size - index);elementData[index] = obj;size++;}/** * 数组扩容 */private void ensureCapacity(){//数组扩容和数据的拷贝if(size==elementData.length){Object[] newArray = new Object[size*2+1];System.arraycopy(elementData, 0, newArray, 0, elementData.length);//for(int i=0;i<elementData.length;i++){//newArray[i] = elementData[i];//}elementData = newArray;}}/** * 数组下标检查 * @param index */private void rangeCheck(int index){if(index<0||index>=size){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {MyArrayList list = new MyArrayList(3);list.add("333");list.add("444");list.add("5");list.add("344433");list.add("333");list.add("333");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }System.out.println("------------------------------"); list.remove("444");list.add(2, "a");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }}}


测试结果:

333
444
5
344433
333
333
------------------------------
333
5
a
344433
333
333





0 0
原创粉丝点击