源码分析之手写ArrayList

public class ExtArrayList {

	// 底层采用数组存放
	private Object[] elementData;
	// 数组默认容量
	private static final int DEFAULT_CAPACITY = 10;
	// 实际arraylist长度
	private int size;

	// 数组初始容量
	public ExtArrayList(int initialCapacity) {
		if (initialCapacity < 0) {
			throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
		}
		elementData = new Object[initialCapacity];
	}

	// 默认数组的容量
	public ExtArrayList() {
		this(DEFAULT_CAPACITY);
	}

	// 线程安全
	public void add(Object object) {
		ensureExplicitCapacity(size + 1);
		elementData[size++] = object;
		/*// 1.判断实际存放的容量是否大于elementData
		if (size == elementData.length) {
			// 新数组的容量大小
			int newCapacity = 2 * size;
			
			 * Object[] newObjects = new Object[newCapacity]; for (int i = 0; i
			 * < elementData.length; i++) { newObjects[i] = elementData[i]; }
			 
			elementData = Arrays.copyOf(elementData, newCapacity);
		}
		// 2.使用下表赋值
		elementData[size++] = object;*/
	}

	public void add(int index, Object object) {
		get(index);
		ensureExplicitCapacity(size + 1);
		System.arraycopy(elementData, index, elementData, index + 1, size - index);
		elementData[index] = object;
		size++;
	}
	public void ensureExplicitCapacity(int minCapacity) {
		// 如果存入的数据,超出了默认数组初始容量 就开始实现扩容
		if (size == elementData.length) {
			// 获取原来数组的长度 2
			int oldCapacity = elementData.length;
			// oldCapacity >> 1 理解成 oldCapacity/2 新数组的长度是原来长度1.5倍
			int newCapacity = oldCapacity + (oldCapacity >> 1); // 3
			if (newCapacity < minCapacity) {
				// 最小容量比新容量要小的,则采用初始容量minCapacity
				newCapacity = minCapacity;
			}
			// System.out.println("oldCapacity:" + oldCapacity + ",newCapacity:"
			// + newCapacity);
			elementData = Arrays.copyOf(elementData, newCapacity);
		}
	}
	// 使用下表获取数组元素
	public Object get(int index) {
		return elementData[index];
	}

	// 删除元素 下标
	public Object remove(int index) {
		// 查询元素
		get(index);
		// 删除原理分析
		int numMoved = size - index - 1;
		if (numMoved > 0)
			System.arraycopy(elementData, index + 1, elementData, index, numMoved);
		elementData[--size] = null; // clear to let GC do its work

		return null;
	}
	//删除元素 对象
	public boolean remove(Object obj){
		for (int i = 0; i < elementData.length; i++) {
			Object value=elementData[i];
			if(value.equals(obj)){
				remove(i);
				return true;
			}
		}
		return false;
	}

	public int getSize() {
		return size;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值