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;
}
}