```java
public class MyArrayList<E> {
private Object[] elementData = null;
private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private int size = 0;
public MyArrayList() {
elementData = new Object[DEFAULT_CAPACITY];
}
public MyArrayList(int initCapacity) {
if (initCapacity > 0) {
elementData = new Object[initCapacity];
} else if (0 == initCapacity) {
elementData = new Object[DEFAULT_CAPACITY];
} else {
throw new IllegalArgumentException("指定数组容量不符合!!!");
}
}
public boolean add(E e) {
add(size, e);
return true;
}
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new ArrayIndexOutOfBoundsException("数组下标不合法!");
}
if (size == elementData.length) {
grow(size + 1);
}
for (int i = size; i > index; i--) {
elementData[i] = elementData[i - 1];
}
elementData[index] = e;
size += 1;
}
public E remove(int index) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException("数组下标不合法!");
}
E temp = this.get(index);
for (int i = index; i < size - 1; i++) {
elementData[i] = elementData[i + 1];
}
elementData[size - 1] = null;
size -= 1;
return temp;
}
public E remove(Object obj) {
int index = indexOf(obj);
if (index != -1) {
return remove(index);
}
return null;
}
public E get(int index) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException("数组下标不合法!");
}
return (E) elementData[index];
}
public int size() {
return size;
}
public boolean isEmpty() {
return 0 == size;
}
public boolean contains(Object obj) {
return indexOf(obj) != -1;
}
public MyArrayList<E> subList(int fromIndex, int endIndex) {
if (fromIndex < 0 || endIndex >= size || endIndex <= fromIndex) {
throw new ArrayIndexOutOfBoundsException("下标不合法!!!");
}
MyArrayList<E> temp = new MyArrayList<>(endIndex - fromIndex);
for (int i = fromIndex; i < endIndex; i++) {
temp.add(this.get(i));
}
return temp;
}
public E set(int index, E e) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException("数组下标不合法!");
}
E temp = get(index);
elementData[index] = e;
return temp;
}
public int indexOf(Object obj) {
int index = -1;
for (int i = 0; i < size; i++) {
if (obj == elementData[i]) {
index = i;
}
}
return index;
}
public int lastIndexOf(Object obj) {
int index = -1;
for (int i = size - 1; i >= 0; i--) {
if (obj == elementData[i]) {
index = i;
}
}
return index;
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}