ArrayList 的动态扩容机制

废话少说直接给代码:

// 默认大小
	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 ********** 和它刚好相关

发布了51 篇原创文章 · 获赞 65 · 访问量 3246

猜你喜欢

转载自blog.csdn.net/weixin_44678969/article/details/102772718