废话少说直接给代码:
// 默认大小
private static final int DEFAULT_CAPACITY=10;
//空表的标识
private static final Object[] EMPTY_ELEMENTDATA= {};
// 关键字避免序列化
transient Object [] elementData;
//指定大小
private int size;
//构造方法
public ArrayList2(Object[] elementData, int size)
{
this.elementData = elementData;
this.size = size;
}
// 添加元素方法
public void add(E e, Object[] elementData,int s)
{
if(s==elementData.length)
elementData=grow();
elementData[s] = e;
size = s+1;
}
private Object[] grow()
{
//容器最小大小
return grow(size+1);
}
//动态扩容
private Object[] grow(int minCapacity)
{
//将原容器数据复制到同名新容器内
return elementData = Arrays.copyOf(elementData, newCapacity(minCapacity));
}
然后会调用 nerCapacity(X)里面的方法进行扩容:
int oldCapacity = elementData.length;
//将原来的大小向右移动一位,位移动是为了提高计算效率
int newCapacity = oldCapacity + oldCapacity>>1;
算出来的 newCapacity 也要进行范围的判断,因为有可能会超过 Int 的取值范围。
还要跟默认大小进行比较。
总结: 如果你使用 ArrayList 时不指定大小,则会动态扩容,每次复制上一个容器的大小和数据,并赋值给同名的新容器,效率可想而知。
你要记住要制定它的大小哦。
注: 实现 list 接口,还有一个对象 LinkedList 它是一个双向的数组链表。
********************* 优点 ********************** 缺点
ArrayList *******访问数据块 ****************** 插入,删除数据慢
LinkedList ********** 和它刚好相关