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--上海每特教育--分布式微服务高级架构师培训