ArrayList的最大优点是查询速度较快,但是插入和删除效率低。下面参照ArrayList的源码,写一个山寨的MyArrayList类,来体验一下为什么插入和删除慢。在这个自定义的类中,只定义了add(), get(), size(), remove()几个方法。
package com.test.list;
public class MyArrayList
{
private Object[]data = new Object[10];
private int size = 0;
public void add(Object obj)
{
if(size == data.length)//判断数组是否已装满
{
//如果size等于数组的长度,就要新创建一个数组
Object[]newData = new Object[data.length * 3 / 2 + 1];
//将原数组中的元素拷贝到新数组中
System.arraycopy(data, 0, newData, 0, data.length);
//将data指向新数组
data = newData;
}
data[size++] = obj;
}
public Object get(int index)
{
checkIndex(index);
return data[index];
}
public int size()
{
return size;
}
public void remove(int index)
{
checkIndex(index);
//将制定位置的以后的元素先前复制,将最后一个元素设为null
System.arraycopy(data, index+1, data, index, size - index - 1);
data[--size]= null;
}
private void checkIndex(int index)
{
//如果传入的index超出范围,就会抛出IndexOutOfBoundsException
if(index >= size)
throw new java.lang.IndexOutOfBoundsException("Index: "+ index + ", Size: "+ size);
}
}
创建MyArrayList实例,并演示一下方法。通过上面的代码可以看出,在插入和删除元素时都要复制元素,所以效率才会低。
package com.test.list;
public class MyArrayListTest
{
public static void main(String[] args)
{
MyArrayList list = new MyArrayList();
list.add("java01");
list.add("java02");
list.add("java03");
System.out.println(list.size());
//将java02删除
list.remove(1);
for(int i = 0; i < list.size(); i++)
{
System.out.println(list.get(i));
}
}
}