java种的ArrayList 底层就是使用数组进行存储,这里就为大家示范一下,其他细节读者可以自己再去填补!
读者可以自己添加泛型进行处理。
package ArrayListWZF;
import java.util.Arrays;
public class MyArrayList
{
//集合初始化容量
private static final int CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
// 初始化数组
private Object[] elementData;
//当前存放元素的实际大小
private int size;
//默认不指定容量 就初始化10大小的数组
public MyArrayList()
{
this.elementData=new Object[CAPACITY];
}
//根据容量初始化 集合中的数组
public MyArrayList(int capacity)
{
if(capacity>0)
{
this.elementData=new Object[capacity];
}
else if(capacity==0)
{
this.elementData=EMPTY_ELEMENTDATA;
}
else
{
throw new IllegalArgumentException("集合初始化大小不能小于0: "+
capacity);
}
}
/**
* 向集合中添加一个元素
* @param o
*/
public void add(Object o)
{
//确保 最小容量够用
ensureCapacity(size+1);
elementData[size++]=o;
}
// 意思就是增加一个元素后,是否超出了数组的本来的原长度? 如果超出了就开始扩容,否者就不扩容
private void ensureCapacity(int minCapacity)
{
if(minCapacity>this.elementData.length)
{
//扩容数组长度
grow(minCapacity);
}
}
/**
* 扩容
* @param minCapacity
*/
private void grow(int minCapacity)
{
int oldCapacity=this.elementData.length;
//扩容1.5倍
int newCapacity=oldCapacity+(oldCapacity>>1);
//判断扩容后是否小于minCapacity 这个判断就是针对初始容量为1的集合准备的
if(newCapacity<minCapacity)
{
newCapacity=minCapacity;
}
//进行数组扩容了
elementData=Arrays.copyOf (elementData,newCapacity);
}
/**
* 获取元素
* @param index 下标
* @return
*/
public Object get(int index)
{
if(index>=0&&index<elementData.length)
{
return this.elementData[index];
}
throw new IndexOutOfBoundsException ("数组下标越界");
}
/**
* 根据下标索引删除 指定的元素
* @param index
* @return
*/
public Object removeByIndex(int index)
{
rangeCheck(index);
Object o=this.elementData[index];
//计算此元素后的 剩余元素的总个数
int numMoved = size - index - 1;
//代表不是最后一个元素
if(numMoved>0)
{
System.arraycopy (elementData,index+1,elementData,index,numMoved);
}
//然后把最后面的一个置空
elementData[--size]=null;
return o;
}
public boolean removeByObj(Object o)
{
if(o==null)
{
for (int i = 0; i <size ; i++)
{
if(elementData[i]==null)
{
removeByIndex (i); //一般情况下删除第一个匹配的就退出循环
return true;
}
}
}
else
{
for (int i = 0; i <size ; i++)
{
if(o.equals (elementData[i]))
{
removeByIndex (i); //一般情况下删除第一个匹配的就退出循环
return true;
}
}
}
return false;
}
/**
* 确保下标索引的范围
* @param index
*/
private void rangeCheck(int index)
{
if(index>=size||index<0)
{
throw new RuntimeException("此集合中没有此元素");
}
}
@Override
public String toString()
{
return "MyArrayList{" + "elementData=" + Arrays.toString (elementData) + '}';
}
}
测试:
package ArrayListWZF;
public class ArrayListTest
{
public static void main(String[] args)
{
/*ArrayList<String> arrayList = new ArrayList<> ();
arrayList.add ("111");
arrayList.add ("222");*/
MyArrayList myArrayList = new MyArrayList ();
myArrayList.add ("1");
myArrayList.add ("2");
myArrayList.add ("3");
myArrayList.add ("4");
myArrayList.add (null);
myArrayList.add ("5");
System.out.println ("===删除前===");
System.out.println (myArrayList);
System.out.println ("===删除后===");
/* myArrayList.removeByIndex (1);
myArrayList.removeByIndex (2);*/
myArrayList.removeByObj ("1");
System.out.println (myArrayList);
}
}