陌兮大魔王带你深入 学习ArrayList(二)

来源:互联网 发布:windows日志 u盘 编辑:程序博客网 时间:2024/05/29 03:16

前引

上一篇文章已经讲解了ArrayList的源码。这一章节,我们主要是来实现自己的ArrayList。看完ArrayList的源码之后,大家肯定都发现了自己定义一个也并不难。是不是有点雀雀预试的感觉?

自定义实现ArrayList

这里就不多说了,直接附上自己的代码吧(这里是引用别人的代码):
package com.wxp.collectionTest;public class MyArrayList {private Object[] elementData;private int size;public int size(){return size;}public boolean isEmpty(){return size==0;}public MyArrayList(){this(10);}public MyArrayList(int initialCapacity){if(initialCapacity<0){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}elementData = new Object[initialCapacity];}public void add(Object obj){//数组扩容和数据的拷贝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;}elementData[size++]=obj;//size++;}public Object get(int index){rangeCheck(index);return elementData[index];}public void remove(int index){rangeCheck(index);//删除指定位置的对象//a b d eint numMoved = size - index - 1;if (numMoved > 0){System.arraycopy(elementData, index+1, elementData, index,numMoved);}elementData[--size] = null; // Let gc do its work}public void remove(Object obj){for(int i=0;i<size;i++){if(get(i).equals(obj)){  //注意:底层调用的equals方法而不是==.remove(i);}}}public Object set(int index,Object obj){rangeCheck(index);Object oldValue =  elementData[index];elementData[index] = obj;return oldValue;}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;}}private void rangeCheck(int index){if(index<0||index>=size){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}}}
讲解恐怕也没什么好讲了的。大部分都是仿照ArrayList实现的。大家也可以下去练一练手,主要是看看别人的封装技巧!虽然就是这么简短的代码,但是每一个人都在用,而且还没有人想用别的什么类似的容器取代他,用来存放经常被查询的数据的地位,足以见得,封装思维的巧妙!





2 0
原创粉丝点击