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));
}
}
}
自己动手编写ArrayList
最新推荐文章于 2022-01-06 23:13:26 发布