数组简介
首先我们来简单的了解下什么是数组,数组是在内存中开辟出一段连续的空间用来存储数据,如下图所示。
既然是用来存储数据,就涉及到寻址问题,我们来看下数组是如何寻址的。因为是一段连续的空间,那么只要知道首地址和数组下标就可以计算出要查询数组元素的内存地址。比如说数组的首地址0x0001,数组中每个元素占4个字节,那么下标为1的地址为0x0005。
也就是因为这个原因,在数组中查询元素,如果知道数组下标,那么是O(1)的操作,但是也会因为开辟出的空间没有使用,而造成空间浪费。
动态数组
为了解决空间浪费,简单实现了一个动态数组,当数组中元素的个数等于数组容量时,会扩容为原来2倍。当数组中元素的个数等于数组容量的1/4时,会缩容为原来的1/2。
这里的缩容为什么不是元素个数等于1/2时,就进行缩容呢?
我们做个假设,加入数组容量时10,当向数组中添加第11个元素,数组的容量会扩容为20。这个时候我们再移除一个元素,会触发缩容操作,如果再添加元素,又会触发扩容操作。为了避免频繁扩容和缩容的这个问题,才使元素个数等于容量的1/4时,再进行缩容操作。
代码比较简单,如下所示。
public class DynamicArray<E> {
//数据
private E[] data;
//数组中元素的个数
private int size;
//数组默认容量
private static