自己动手编写ArrayList

package test;

import java.util.AbstractList;

public class MyArrayList<E> extends AbstractList<E> {

	/**
	 * @info 元素的大小
	 */
	private int size;
	/**
	 * @info 默认初始化大小
	 */
	private int initSize = 10;
	private E[] ele;

	@SuppressWarnings("unchecked")
	public MyArrayList() {
		ele = (E[]) new Object[initSize];
	}

	@SuppressWarnings("unchecked")
	public MyArrayList(int initSize) {
		ele = (E[]) new Object[initSize];
	}

	@Override
	public E get(int index) {
		checkIndex(index);
		return ele[index];
	}

	@Override
	public int size() {
		return this.size;
	}

	@SuppressWarnings("unchecked")
	@Override
	public boolean add(E e) {
		if (size >= ele.length) {
			// 进行扩容
			Object[] ne = new Object[(int) (ele.length * 1.5) + 1];
			System.arraycopy(ele, 0, ne, 0, ele.length);
			ele = (E[]) ne;
		}
		ele[size++] = e;
		return true;
	}

	@SuppressWarnings("unchecked")
	@Override
	public void add(int index, E element) {
		// 检查下标是否越界
		checkIndex(index);
		// 复制替换以及后面的元素
		Object[] ne = new Object[ele.length + 1];
		System.arraycopy(ele, index, ne, index + 1, ele.length - index);
		// 下标前的元素复制到新数组
		System.arraycopy(ele, 0, ne, 0, index);
		// 替换指定索引的下标
		ne[index] = element;
		// 将新的数组返回
		ele = (E[]) ne;
		size++;
	}

	/**
	 * @info 返回值的索引,如果没有就返回-1
	 */
	@Override
	public int indexOf(Object o) {
		if (o == null) {
			for (int index = 0; index < size; index++) {
				if (ele[index] == null) {
					return index;
				}
			}
		} else {
			for (int index = 0; index < size; index++) {
				if (o.equals(ele[index])) {
					return index;
				}
			}
		}
		return -1;
	}

	@Override
	public E set(int index, E element) {
		checkIndex(index);
		E e = ele[index];
		ele[index] = element;
		return e;
	}

	@Override
	public boolean remove(Object o) {
		int index = indexOf(o);
		boolean flag = false;
		if (index != -1) {
			flag = true;
			ele[index] = null;
			System.arraycopy(ele, index + 1, ele, index, size - index);
			size--;
		}
		return flag;
	}

	@Override
	public E remove(int index) {
		checkIndex(index);
		E e = ele[index];
		remove(e);
		return e;
	}

	@Override
	public void clear() {
		if (size > 0) {
			for (int index = 0; index < size; index++) {
				ele[index] = null;
			}
			size = 0;
		}
	}

	@Override
	public boolean contains(Object o) {
		return indexOf(o) > -1;
	}

	/**
	 * @info 检查数组下标
	 * @param index
	 */
	private void checkIndex(int index) {
		if (index > this.size - 1 || index < 0) {
			throw new IndexOutOfBoundsException(String.valueOf(index));
		}
	}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值