纯手写ExtArrayList

package com.xuyuedu.arraylist;

import java.util.Arrays;

/**
 * 自定义ArrayList集合<br>
 * 
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class ExtArrayList<E> implements ExtList<E>{

	// ArrayList底层采用数组存放
	private Object[] elementData;
	// 默认数组容量为10
	private static final int DEFAULT_CAPACITY = 10;
	// 记录实际ArrayList大小
	private int size;

	// ArrayList 指定数组初始容量
	public ExtArrayList(int initialCapacity) {
		if (initialCapacity < 0) {
			throw new IllegalArgumentException("初始容量不能下于 " + initialCapacity);
		}
		elementData = new Object[initialCapacity];
	}

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

	// 线程安全问题
	public void add(E e) {
		// 1.判断实际存放的数组容量是否大于elementData
		ensureExplicitCapacity(size + 1);
		// 2.使用下标进行赋值
		elementData[size++] = e;
	}

	// int minCapacity 当前size+1
	private void ensureExplicitCapacity(int minCapacity) {
		if (size == elementData.length) {
			// 原来本身elementData容量大小
			int oldCapacity = elementData.length;
			// 新数据容量大小
			int newCapacity = oldCapacity + (oldCapacity >> 1);
			// 最小扩容容量大小
			if (newCapacity - minCapacity < 0)
				newCapacity = minCapacity;
			// 将老数组的值赋值到新数组上面去
			elementData = Arrays.copyOf(elementData, newCapacity);
		}
	}

	// 使用下标获取数组元素
	
	public E get(int index) {
		rangeCheck(index);
		return elementData(index);
	}
	E elementData(int index) {
		return (E) elementData[index];
	}

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

	}

	private void rangeCheck(int index) {
		if (index >= size)
			throw new IndexOutOfBoundsException("越界了!");
	}

	public E remove(int index) {
		// 1.使用下标查询该值是否存在
		E e = get(index);
		// 2.删除原理分析 使用arraycopy往前移动数据,将最后一个变为空
		// 计算删除元素后面的元素
		int numMoved = size - index - 1;
		if (numMoved > 0)
			System.arraycopy(elementData, index + 1, elementData, index, numMoved);
		// 把最后一个元素赋值null
		elementData[--size] = null;

		return e;
	}

	public int getSize() {
		return size;
	}

	public void add(int index, E e) {
		//判断实际存放的容量是否大于elementData容量
		ensureExplicitCapacity(size + 1); 
		System.arraycopy(elementData, index, elementData, index + 1, size - index);
		elementData[index] = e;
		size++;
	}
}
package com.xuyuedu.arraylist;

/**
 * 自定义List泛型接口
 * @author Administrator
 *
 * @param <E>
 */
public interface ExtList<E> {
	public void add(E object);

	public void add(int index, E object);

	public Object remove(int index);

	public boolean remove(E object);

	public int getSize();

	public Object get(int index);
}

余胜军qq:644064779--上海每特教育--分布式微服务高级架构师培训

猜你喜欢

转载自blog.csdn.net/qq_38357267/article/details/81588872